文/劉明 李俊峰
隨著硬件資源的性能大大提高和軟件的開(kāi)發(fā)發(fā)展,為了提高資源的利用率,容器技術(shù)和微服務(wù)架構(gòu)逐漸成為人們高效生產(chǎn)的開(kāi)發(fā)部署方式。Docker和虛擬機(jī)一樣也是一種資源隔離的技術(shù),但它內(nèi)部不需要操作系統(tǒng),所以它比起虛擬機(jī)優(yōu)點(diǎn)不僅僅是所占用的資源少,它的維護(hù)成本也更低。而Kubernetes作為讓部署容器化應(yīng)用簡(jiǎn)單高效的一個(gè)開(kāi)源容器編排引擎,已經(jīng)成為容器云平臺(tái)的主流。
Kubernetes是開(kāi)源的,在實(shí)際的場(chǎng)景中,我們?cè)诖罱↘ubernetes平臺(tái)時(shí),需要在多臺(tái)機(jī)器中部署Kubernetes,因此考慮到容器的輕便性和在機(jī)器中快速拉起的效果,容器化部署Kurbernetes是一個(gè)不錯(cuò)的解決方案。
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:宿主機(jī)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包含了基礎(chǔ)鏡像,維護(hù)者信息,鏡像操作指令和容器啟動(dòng)時(shí)執(zhí)行的指令。
創(chuàng)建安裝基礎(chǔ)鏡像:
FROM centos #使用centos基礎(chǔ)鏡像啟動(dòng)構(gòu)建流程
RUN mkdir /tmp/releases &&mkdir /tmp/releases/offline &&mkdir /tmp/releases/offline/whl #創(chuàng)建文件夾
ADD local/ /tmp/releases/local/ #復(fù)制文件到容器中
ADD kubeadm /tmp/releases/kubeadm #復(fù)制kubeadm到容器中
COPY istio-1.0.0-linux.tar.gz /tmp/releases/istio-1.0.0-linux.tar.gz #復(fù)制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 #把當(dāng)前目錄復(fù)制到容器內(nèi)
三臺(tái)虛擬機(jī)(3 節(jié)點(diǎn))組成的高可用集群,一臺(tái)虛擬機(jī)做安裝機(jī)器Kicker Machine,集群虛機(jī)需關(guān)閉防火墻(firewalld);
集群中每臺(tái)虛擬機(jī)推薦最低配置為4CPU,8G內(nèi)存,100G硬盤;Kicker Machine要求運(yùn)行Docker;
集群節(jié)點(diǎn)操作系統(tǒng):CentOS7.0+,最小化安裝;
安裝步驟
Kicker Machine安裝Docker:
依次執(zhí)行以下命令安裝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
安裝完畢后打開(kāi)docker:
systemctl start docker
進(jìn)入到安裝包目錄下,從tar包導(dǎo)入鏡像:
docker import installer-xxxx.tar installer:tag(tag自行填寫)
運(yùn)行installer容器:
docker run -i -d --name installer installer:tag bash
進(jìn)入容器內(nèi)部:
docker exec -it installer bash
安裝部署OneCCP
在容器內(nèi)部進(jìn)入/tmp/releases/installer目錄。
生成SSH-Key:
ssh-keygen
依次復(fù)制密鑰給每臺(tái)節(jié)點(diǎn),實(shí)現(xiàn)免密登錄:
圖2:容器內(nèi)IPv6應(yīng)用
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為節(jié)點(diǎn)IP,用戶最好為root用戶)
給playbook設(shè)置主機(jī),依次執(zhí)行:
cp -rfp inventory/sample inventory/mycluster
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5) #IP為節(jié)點(diǎn)IP用空格隔開(kāi)
CONFIG_FILE=inventory/mycluster/hosts.ini python3 contrib/inventory_builder/inventory.py ${IPS[@]}
ansible-playbook -i inventory/mycluster/hosts.ini cluster.yml
接下來(lái)安裝機(jī)器就會(huì)自動(dòng)在各個(gè)節(jié)點(diǎn)自動(dòng)部署Kubernetes。
Docker中的網(wǎng)絡(luò)資源也是隔離的,雖然容器之間是依靠namespaces來(lái)進(jìn)行資源隔離的,但是它的網(wǎng)絡(luò)是按照Pod來(lái)分配的,每個(gè)Pod都擁有自己獨(dú)立的IP地址,Pod中的容器共享IP地址和端口號(hào)。在Docker中則依靠網(wǎng)絡(luò)命名空間來(lái)將獨(dú)立的網(wǎng)絡(luò)協(xié)議棧劃分到不同的命名空間中,在不同的網(wǎng)絡(luò)命名空間的兩個(gè)容器,彼此是看不見(jiàn)對(duì)方的,只有通過(guò)網(wǎng)絡(luò)命名空間內(nèi)部建立對(duì)應(yīng)的路由表,才能實(shí)現(xiàn)互相通信。
Bridge模式:默認(rèn)模式,該模式為容器創(chuàng)建一個(gè)虛擬的網(wǎng)橋,也就是獨(dú)立的網(wǎng)絡(luò)命名空間。
Host模式:容器和宿主機(jī)共享網(wǎng)絡(luò)。
None模式:不為容器配置任何網(wǎng)絡(luò)。
Container模式:多個(gè)容器共享一個(gè)網(wǎng)絡(luò)命名空間。
Docker默認(rèn)使用的是Bridge模式,在Bridge模式中,網(wǎng)橋會(huì)自動(dòng)為容器和宿主機(jī)創(chuàng)建一對(duì)對(duì)應(yīng)的網(wǎng)卡來(lái)進(jìn)行容器和宿主機(jī)之間的通信,并且一個(gè)虛擬網(wǎng)橋可以有多個(gè)虛擬網(wǎng)卡對(duì)。而docker0網(wǎng)橋是docker安裝啟動(dòng)的時(shí)候就在主機(jī)上生成,所有的容器的流量都會(huì)通過(guò)docker0進(jìn)行轉(zhuǎn)發(fā),因此同一個(gè)宿主機(jī)的容器與容器之間自然是可以相互通信的。
在虛擬化的環(huán)境中我們已有IPv6的底層網(wǎng)絡(luò)環(huán)境,容器中要使用IPv6有兩種方式:方法一、僅宿主機(jī)使用IPv6地址。只要Docker把宿主機(jī)的IPv6地址端口映射到容器的IPv4端口上,隨后訪問(wèn)宿主機(jī)的IPv6相應(yīng)端口即可。方法二、為容器配置IPv6網(wǎng)絡(luò)環(huán)境,則需要對(duì)Docker原有配置進(jìn)行修改,讓其開(kāi)啟IPv6支持。在/etc/docker/daemon.json文件中添加如下配置:
重啟Docker生效,Docker將自動(dòng)為新創(chuàng)建的容器配置IPv6網(wǎng)絡(luò)。在該容器中部署的IPv6應(yīng)用就可以被同宿主機(jī)的容器進(jìn)行訪問(wèn)。而不同宿主機(jī)或者是外網(wǎng)IPv6環(huán)境需要訪問(wèn)應(yīng)用就需要通過(guò)端口映射的方式,將容器內(nèi)的端口綁定映射到宿主機(jī)的端口(docker -i -t --name 容器名稱 -p 主機(jī)端口:容器端口),這樣外網(wǎng)或應(yīng)用訪問(wèn)時(shí),直接訪問(wèn)宿主機(jī)的IP和端口號(hào)既是對(duì)應(yīng)容器的IP,也不用擔(dān)心容器的IP隨著容器的生命周期而發(fā)生變化。