文/劉明 李俊峰
隨著硬件資源的性能大大提高和軟件的開發發展,為了提高資源的利用率,容器技術和微服務架構逐漸成為人們高效生產的開發部署方式。Docker和虛擬機一樣也是一種資源隔離的技術,但它內部不需要操作系統,所以它比起虛擬機優點不僅僅是所占用的資源少,它的維護成本也更低。而Kubernetes作為讓部署容器化應用簡單高效的一個開源容器編排引擎,已經成為容器云平臺的主流。
Kubernetes是開源的,在實際的場景中,我們在搭建Kubernetes平臺時,需要在多臺機器中部署Kubernetes,因此考慮到容器的輕便性和在機器中快速拉起的效果,容器化部署Kurbernetes是一個不錯的解決方案。
k8s .gcr .io/ kube-proxy-amd64 v1.10.1
k8s .gcr .io/ kube-scheduler-amd64 v1.10.1
k8s .gcr .io/ kube-apiserver-amd64 v1.10.1
k8s .gcr .io/ kube-controller-manager-amd64 v1.10.1
k8s .gcr .io/ etcd-amd64 3.1.12
k8s .gcr .io/ kubernetes-dashboard-amd64 vl.8.3

圖1:宿主機IPv6
k8s .gcr .io/ k8s-dns-dnsmasq-nanny-amd64 1.14.8
k8s .gcr .io/ k8s-dns-sidecaramd64 1.14.8
k8s .gcr .io/ k8s-dnskubedns-amd64 1.14.8
k8s .gcr .io/ pause-amd64 3.1
quay.io/coreos/flannel-amd64 v0.9.1
Dockerfile包含了基礎鏡像,維護者信息,鏡像操作指令和容器啟動時執行的指令。
創建安裝基礎鏡像:
FROM centos #使用centos基礎鏡像啟動構建流程
RUN mkdir /tmp/releases &&mkdir /tmp/releases/offline &&mkdir /tmp/releases/offline/whl #創建文件夾
ADD local/ /tmp/releases/local/ #復制文件到容器中
ADD kubeadm /tmp/releases/kubeadm #復制kubeadm到容器中
COPY istio-1.0.0-linux.tar.gz /tmp/releases/istio-1.0.0-linux.tar.gz #復制linux鏡像文件
RUN pip3 freeze >/tmp/releases/offline/whl/requirements.txt && cd /tmp/releases/offline/whl&& pip3 wheel -r /tmp/releases/offline/whl/requirements.txt #下載安裝kubernetes所需依賴
ADD . /tmp/releases/containers #把當前目錄復制到容器內
三臺虛擬機(3 節點)組成的高可用集群,一臺虛擬機做安裝機器Kicker Machine,集群虛機需關閉防火墻(firewalld);
集群中每臺虛擬機推薦最低配置為4CPU,8G內存,100G硬盤;Kicker Machine要求運行Docker;
集群節點操作系統:CentOS7.0+,最小化安裝;
安裝步驟
Kicker Machine安裝Docker:
依次執行以下命令安裝docker-ce:
sudo yum install -y yum-utils
device-mapper-persistent-data lvm2
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
安裝完畢后打開docker:
systemctl start docker
進入到安裝包目錄下,從tar包導入鏡像:
docker import installer-xxxx.tar installer:tag(tag自行填寫)
運行installer容器:
docker run -i -d --name installer installer:tag bash
進入容器內部:
docker exec -it installer bash
安裝部署OneCCP
在容器內部進入/tmp/releases/installer目錄。
生成SSH-Key:
ssh-keygen
依次復制密鑰給每臺節點,實現免密登錄:

圖2:容器內IPv6應用
ssh-copy-id root@10.10.1.3
ssh-copy-id root@10.10.1.4
ssh-copy-id root@10.10.1.5
(IP為節點IP,用戶最好為root用戶)
給playbook設置主機,依次執行:
cp -rfp inventory/sample inventory/mycluster
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5) #IP為節點IP用空格隔開
CONFIG_FILE=inventory/mycluster/hosts.ini python3 contrib/inventory_builder/inventory.py ${IPS[@]}
ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml
接下來安裝機器就會自動在各個節點自動部署Kubernetes。
Docker中的網絡資源也是隔離的,雖然容器之間是依靠namespaces來進行資源隔離的,但是它的網絡是按照Pod來分配的,每個Pod都擁有自己獨立的IP地址,Pod中的容器共享IP地址和端口號。在Docker中則依靠網絡命名空間來將獨立的網絡協議棧劃分到不同的命名空間中,在不同的網絡命名空間的兩個容器,彼此是看不見對方的,只有通過網絡命名空間內部建立對應的路由表,才能實現互相通信。
Bridge模式:默認模式,該模式為容器創建一個虛擬的網橋,也就是獨立的網絡命名空間。
Host模式:容器和宿主機共享網絡。
None模式:不為容器配置任何網絡。
Container模式:多個容器共享一個網絡命名空間。
Docker默認使用的是Bridge模式,在Bridge模式中,網橋會自動為容器和宿主機創建一對對應的網卡來進行容器和宿主機之間的通信,并且一個虛擬網橋可以有多個虛擬網卡對。而docker0網橋是docker安裝啟動的時候就在主機上生成,所有的容器的流量都會通過docker0進行轉發,因此同一個宿主機的容器與容器之間自然是可以相互通信的。
在虛擬化的環境中我們已有IPv6的底層網絡環境,容器中要使用IPv6有兩種方式:方法一、僅宿主機使用IPv6地址。只要Docker把宿主機的IPv6地址端口映射到容器的IPv4端口上,隨后訪問宿主機的IPv6相應端口即可。方法二、為容器配置IPv6網絡環境,則需要對Docker原有配置進行修改,讓其開啟IPv6支持。在/etc/docker/daemon.json文件中添加如下配置:

重啟Docker生效,Docker將自動為新創建的容器配置IPv6網絡。在該容器中部署的IPv6應用就可以被同宿主機的容器進行訪問。而不同宿主機或者是外網IPv6環境需要訪問應用就需要通過端口映射的方式,將容器內的端口綁定映射到宿主機的端口(docker -i -t --name 容器名稱 -p 主機端口:容器端口),這樣外網或應用訪問時,直接訪問宿主機的IP和端口號既是對應容器的IP,也不用擔心容器的IP隨著容器的生命周期而發生變化。