我们在三台CentOS 7的KVM虚拟机上搭建环境:
其中cet7-k8s-1是主节点(master),其余两台是worker节点。
下面的操作除非特别申明,在每个节点上都要进行。
编辑/etc/sysconfig/selinux,将enforcing改为disabled:
SELINUX=disabled
Kubernetes运行时需要开放几个端口,这里是测试环境,就暂时将防火墙关闭了:
# systemctl stop firewalld # systemctl disable firewalld
# swapoff -a
编辑/etc/fstab,注释掉swap分区行,例如:
#/dev/mapper/centos-swap swap swap defaults 0 0
Kubernetes支持多个容器运行时runtime,这里使用docker。
在每个节点机器安装docker:
# yum install docker
启动docker:
# systemctl enable docker # systemctl start docker
Kubernetes的安装过程中需要访问外网,如果集群因安全等原因无法直接联网,也可通过代理方式进行访问。
对于命令行应用,比如下面的kubeadm,可设置如下的环境变量来访问代理(假设http代理服务器IP为192.168.122.1,端口8118):
export http_proxy=http://192.168.122.1:8118 export https_proxy=http://192.168.122.1:8118
此外,集群节点之间不通过代理:
export no_proxy=localhost,localhost.,192.168.122.205,192.168.122.64,192.168.122.176
对于docker守护进程,需要修改docker配置文件来设置代理:
# mkdir /etc/systemd/system/docker.service.d # cd /etc/systemd/system/docker.service.d
新建http_proxy.conf:
[Service] Environment="HTTP_PROXY=http://192.168.122.1:8118/" "HTTPS_PROXY=https://192.168.122.1:8118/" "NO_PROXY=localhost,localhost.,192.168.122.205,192.168.122.64,192.168.122.176"
使配置生效:
# systemctl daemon-reload # systemctl restart docker
检验设置是否正确:
# systemctl show --property=Environment docker
在每个节点上安装kubelet、kubectl、kubeadm。
首先设置kubernetes源:
# cat <<EOF >/etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kube* EOF
安装:
# yum install kubelet kubectl kubeadm --disableexcludes=kubernetes
缺省安装的是最新版本,也可安装特定版本:
# yum install kubelet-1.11.3-0 kubectl-1.11.3-0 kubeadm-1.11.3-0 --disableexcludes=kubernetes
设置sysctl:
# cat <<EOF >/etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
使其生效:
# sysctl --system
启动kubelet:
# systemctl enable kubelet # systemctl start kubelet
一切准备就绪,就可以开始集群的初始化工作了。
初始化只在master节点进行。
期间会下载一些docker镜像,为了检测网络是否通畅,可以先下载镜像:
# kubeadm config images pull [config/images] Pulled k8s.gcr.io/kube-apiserver-amd64:v1.11.3 [config/images] Pulled k8s.gcr.io/kube-controller-manager-amd64:v1.11.3 [config/images] Pulled k8s.gcr.io/kube-scheduler-amd64:v1.11.3 [config/images] Pulled k8s.gcr.io/kube-proxy-amd64:v1.11.3 [config/images] Pulled k8s.gcr.io/pause:3.1 [config/images] Pulled k8s.gcr.io/etcd-amd64:3.2.18 [config/images] Pulled k8s.gcr.io/coredns:1.1.3
执行初始化:
# kubeadm init
成功后,会生成如下的命令,其他worker节点可执行该命令加入集群:
# kubeadm join 192.168.122.205:6443 --token 89duwd.yhz457x4hrs7wjzi --discovery-token-ca-cert-hash sha256:b0a429dade431cb040fd10956a740549c77a013f3a131e069933332298bb9579
进行后续的管理工作之前,对普通用户,需做如下设置:
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root,则设置如下环境变量:
# export KUBECONFIG=/etc/kubernetes/admin.conf
现在集群还不可用,需要安装一个网络插件,这里用的是weave:
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
在worker节点上,执行上述生成的join命令,加入集群:
# kubeadm join 192.168.122.205:6443 --token 89duwd.yhz457x4hrs7wjzi --discovery-token-ca-cert-hash sha256:b0a429dade431cb040fd10956a740549c77a013f3a131e069933332298bb9579
在主节点上执行:
$ kubectl get nodes NAME STATUS ROLES AGE VERSION cet7-k8s-1 Ready master 37d v1.13.1 cet7-k8s-2 Ready <none> 37d v1.13.1 cet7-k8s-3 Ready <none> 37d v1.13.1
可以看到,所有节点已经就绪。
至此,一个基本的Kubernetes集群就搭建起来了。