目录

搭建Kubernetes集群环境

Kubernetes是一个开源的容器编排系统,本文讲述一个简单的Kubernetes集群的搭建过程。

参考链接:

环境准备

我们在三台CentOS 7的KVM虚拟机上搭建环境:

  1. cet7-k8s-1,192.168.122.205
  2. cet7-k8s-2,192.168.122.64
  3. cet7-k8s-3,192.168.122.176

其中cet7-k8s-1是主节点(master),其余两台是worker节点。

下面的操作除非特别申明,在每个节点上都要进行。

关闭selinux

编辑/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

安装docker

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守护进程,需要修改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

安装kubeadm

在每个节点上安装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集群就搭建起来了。