容器化技术(六):Kubernetes最全安装指南

239 阅读5分钟

Kubernetes的安装

很多读者在学习Kubernetes的路上,被搁浅在了搭建Kubernetes集群这一步,本小节将带领读者手把手搭建一套Kubernetes集群。安装Kubernetes的方法有很多,比较成熟与简便的办法是采用kubeadm来进行安装。如果我们采用二进制的方式安装,会非常的繁琐。

一、环境准备

1、机器配置要求

Kubernetes集群中的机器被划分一个Master节点和一群Worker节点。本套Kubernetes集群需要三台机器,一台安装Master,两台安装Worker。

  • 机器环境

    • 用作控制平面节点的计算机上至少有2个 CPU。
    • 每台机器 2 GB 以上的内存,内存不足时应用会受限制。
    • linux内核: linux内核必须是 4 版本以上,否则需要把linux核心进行升级。
    • 集群中所有计算机之间具有完全的网络连接。你可以使用公共网络或专用网络。
  • 准备3台虚拟机环境,操作系统为CentOS 7。

    • Kubernetes-Master01:此机器用来安装Kubernetes Master的操作环境。

    • Kubernetes-Worker01:此机器用来安装Kubernetes Worker节点的环境。

    • Kubernetes-Worker02:此机器用来安装Kubernetes Worker节点的环境。

2、设置主机名

分别在对应机器上执行以下命令,给每一台机器设置主机名:

  • hostnamectl set-hostname Kubernetes-Master01
  • hostnamectl set-hostname Kubernetes-Worker01
  • hostnamectl set-hostname Kubernetes-Worker02

3、修改主机Host

在每台机器上,修改目录/etc下的hosts文件,在hosts文件添加以下内容:

192.168.8.11 Kubernetes-Master01 
192.168.8.22 Kubernetes-Worker01 
192.168.8.33 Kubernetes-Worker02

4、机器时间同步

通过date命令,校验下三台机器的时间是否正确,如不正确,执行以下命令,修改机器的时区。

timedatectl set-timezone Asia/Shanghai 

5、禁用交换分区

关闭swap分区【虚拟内存】并且永久关闭虚拟内存:

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

6、Linux内核参数调整

  • 配置参数输出到一个文件中。
cat > kubernetes.conf <<EOF 
net.bridge.bridge-nf-call-iptables=1 
net.bridge.bridge-nf-call-ip6tables=1 
net.ipv4.ip_forward=1 
net.ipv4.tcp_tw_recycle=0 
vm.swappiness=0 
vm.overcommit_memory=1 
vm.panic_on_oom=0 
fs.inotify.max_user_instances=8192 
fs.inotify.max_user_watches=1048576 
fs.file-max=52706963 
fs.nr_open=52706963 
net.ipv6.conf.all.disable_ipv6=1 
net.netfilter.nf_conntrack_max=2310720 
EOF
  • 将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf 
  • 手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf

7、安装相关依赖包

在每台机器上执行以下命令:

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
yum install -y vim net-tools git iproute lrzsz bash-completion tree bridge-utils unzip 
yum install -y bind-utils gcc

二、安装Docker

在每台机器上,都安装Docker,具体的安装步骤参照我的另一篇文章:Docker的安装,这里不再赘述。

三、安装kubeadm、kubelet 和 kubectl

为了安装Kubernetes集群,需要在每台机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

安装Kubernetes的时候,Kubernetes官网给的yum源是packages.cloud.google.com,因为防火墙的原因,国内访问不了。此时可以使用阿里云的yum仓库中的Kubernetes镜像源:mirrors.aliyun.com/kubernetes/…

在系统中,添加Kubernetes的yum源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF 
  • 关闭防火墙:
setenforce 0
  • 可以使用如下命令,查看仓库软件支持版本,我们选择安装1.18.6的版本:
yum list kubelet --showduplicates | sort -r  
  • 指定版本进行部署:
yum -y install kubelet-1.18.6  kubeadm-1.18.6  kubectl-1.18.6 

成功安装的提示如下:

已安装:
  kubeadm.x86_64 0:1.18.6-0                 kubectl.x86_64 0:1.18.6-0                 kubelet.x86_64 0:1.18.6-0

作为依赖被安装:
  cri-tools.x86_64 0:1.13.0-0             kubernetes-cni.x86_64 0:0.8.7-0             socat.x86_64 0:1.7.3.2-2.el7

完毕!
  • 将kubelet设置为开机自启动:
systemctl enable kubelet && systemctl start kubelet

四、Master初始化

在Master节点上执行如下命令,进行主控制平面的初始化:

kubeadm init --kubernetes-version=v1.18.6 --image-repository fvn7v6mj.mirror.aliyuncs.com/mirrorgcrio --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

上面的命令中的参数说明如下:

  • kubernetes-version:指定Kubernetes集群的版本。
  • image-repository:指定镜像的镜像仓库,这个参数很重要,否则默认会去国外的镜像仓库下载,可能会无法下载。
  • pod-network-cidr:指定Kubernetes集群中的Pod的网络地址段。
  • service-cidr:指定Kubernetes集群中的Service的网络地址段。

当提示如下信息的时候,表明已经安装成功,同时注意提示中的两类重要信息:

  • 按照如下的提示,进行Master节点的初始化。
  • 记录提示信息中的,从节点加入集群的命令。
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.8.11:6443 --token 2nng8k.3pyptvx6p3ryh860 \
    --discovery-token-ca-cert-hash sha256:431c932a3dd640368a9d60db994cddf7707c97b45d861ba03f6fbd2cfc1471f0

按照初始步骤中提示的命令,在Master节点上进行以下三步操作:

  • 创建目录,保存连接配置缓存,认证文件。
mkdir -p $HOME/.kube
  • 拷贝集群管理配置文件。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  • 授权给配置文件
sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时,在Master节点上查看Kubernetes集群中的节点运行情况如下,发现节点的运行状态为NotReady,这是因为网络插件还没有安装。

[root@kubernetes-master01 ~]# kubectl get nodes
NAME                  STATUS     ROLES    AGE   VERSION
kubernetes-master01   NotReady   master   79s   v1.18.6

五、安装网络插件

网络的插件有很多,本文采用flannel插件,先在Master节点上从网络上下载flannel的yml文件:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

然后在Master节点上进行安装,安装的提示信息如下:

[root@kubernetes-master01 ~]# kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

此时,在Master节点上查看Kubernetes集群的节点信息,节点的状态已经变成了Ready状态。

[root@kubernetes-master01 ~]# kubectl get nodes
NAME                  STATUS   ROLES    AGE    VERSION
kubernetes-master01   Ready    master   5m1s   v1.18.6

六、Worker加入集群

分别在Worker节点上执行加入的命令(在主节点初始化时提示的信息):

kubeadm join 192.168.8.11:6443 --token 2nng8k.3pyptvx6p3ryh860 \
    --discovery-token-ca-cert-hash sha256:431c932a3dd640368a9d60db994cddf7707c97b45d861ba03f6fbd2cfc1471f0

Worker节点加入Kubernetes集群成功,提示如下信息:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

此时,在Master节点上查看Kubernetes集群的信息,可能部分节点为NotReady的状态,节点加入的过程,会需要一点时间。

[root@kubernetes-master01 ~]# kubectl get nodes
NAME                  STATUS     ROLES    AGE     VERSION
kubernetes-master01   Ready      master   6m48s   v1.18.6
kubernetes-worker01   NotReady   <none>   34s     v1.18.6
kubernetes-worker02   Ready      <none>   34s     v1.18.6

再次在Master节点上查看Kubernetes集群的信息,节点都已经加入成功了。

[root@kubernetes-master01 ~]# kubectl get nodes
NAME                  STATUS   ROLES    AGE     VERSION
kubernetes-master01   Ready    master   7m21s   v1.18.6
kubernetes-worker01   Ready    <none>   67s     v1.18.6
kubernetes-worker02   Ready    <none>   67s     v1.18.6

在Master节点上查看节点中的Pod的信息如下,发现里面有很多的Pod,具体的作用,将在下一小节里说明。

[root@kubernetes-master01 ~]# kubectl get pods -n kube-system
NAME                                          READY   STATUS    RESTARTS   AGE
coredns-589b87488-dsmv8                       1/1     Running   0          42m
coredns-589b87488-pc8tp                       1/1     Running   0          42m
etcd-kubernetes-master01                      1/1     Running   0          42m
kube-apiserver-kubernetes-master01            1/1     Running   0          42m
kube-controller-manager-kubernetes-master01   1/1     Running   0          42m
kube-flannel-ds-5w25c                         1/1     Running   0          38m
kube-flannel-ds-8m9vv                         1/1     Running   0          36m
kube-flannel-ds-j9bbc                         1/1     Running   0          36m
kube-proxy-5gddj                              1/1     Running   0          42m
kube-proxy-b67l7                              1/1     Running   0          36m
kube-proxy-nnstx                              1/1     Running   0          36m
kube-scheduler-kubernetes-master01            1/1     Running   0          42m

七、下篇文章预告

Kubernetes已经安装完成了,你们安装成功了,这可是学习Kubernetes的第一个关卡,过不去,无法继续接下来的游戏哦。 我们下一篇文章将要开始分析Kubernetes集群中安装的组件了