文/刘明 李俊峰
随着硬件资源的性能大大提高和软件的开发发展,为了提高资源的利用率,容器技术和微服务架构逐渐成为人们高效生产的开发部署方式。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随着容器的生命周期而发生变化。