天天看点

二进制安装k8s超详细版本-V1.20

一、环境说明

此环境下需要6台主机,主机地址和角色如下表所示:

主机名 IP地址 集群角色
master1 172.16.213.225 k8s master1
master2 172.16.213.229 k8s master2
master3 172.16.213.230 k8s master3
node1 172.16.213.231 k8s slave1
node2 172.16.213.235 k8s slave2
lbserver 172.16.213.236 k8s master vip

在这个环境中,k8s集群我们采用三个master节点,两个node节点,其中,三个master节点通过haproxy实现k8s-api的负载均衡。

二、系统基础配置

1、内核升级

k8s在较低内核中存在某些bug,因此需要先升级下系统内核。建议使用4.10或以上版本内核,在master1/2/3和node1/2主机上依次执行如下操作,升级过程如下:

#升级内核:

[root@master1 kernel]#  wget

https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-5.10.3-1.el7.elrepo.x86_64.rpm https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.10.3-1.el7.elrepo.x86_64.rpm

[root@master1 kernel]#  yum -y install kernel-ml-5.10.3-1.el7.elrepo.x86_64.rpm  kernel-ml-devel-5.10.3-1.el7.elrepo.x86_64.rpm

# 调整默认内核启动

[root@master1 kernel]# cat /boot/grub2/grub.cfg |grep menuentry

[root@master1 kernel]# grub2-set-default "CentOS Linux (5.10.3-1.el7.elrepo.x86_64) 7 (Core)"

# 检查是否修改正确

[root@master1 kernel]# grub2-editenv list

[root@master1 kernel]# reboot

2、开启IPVS支持

内核升级完成后,首先确认内核版本是否正确,执行如下命令;

[root@master1 kernel]# uname  -a

接着,创建/etc/sysconfig/modules/ipvs.modules文件,内容如下:

#!/bin/bash

ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"

for kernel_module in ${ipvs_modules}; do

  /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1

  if [ $? -eq 0 ]; then

    /sbin/modprobe ${kernel_module}

  fi

done

最后,执行如下命令使配置生效:

[root@master1 kernel]# chmod 755 /etc/sysconfig/modules/ipvs.modules

[root@master1 kernel]# sh /etc/sysconfig/modules/ipvs.modules

[root@master1 kernel]# lsmod | grep ip_vs

如果执行lsmod命令能看到ip_vs相关模块信息,表明ipvs开启成功。

3、关闭防火墙、swap设置

K8s集群每个节点都需要关闭防火墙,执行如下操作:

[root@master1 kernel]# systemctl stop firewalld && systemctl disable firewalld

[root@master1 kernel]# setenforce 0

[root@master1 kernel]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

接着,还需要关闭系统的交换分区,执行如下命令:

[root@master1 kernel]# swapoff -a

[root@master1 kernel]# cp /etc/fstab  /etc/fstab.bak

[root@master1 kernel]# cat /etc/fstab.bak | grep -v swap > /etc/fstab

然后,还需要修改iptables设置,在/etc/sysctl.conf中添加如下内容:

vm.swappiness = 0

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

net.bridge.bridge-nf-call-ip6tables = 1

最后,执行如下命令,以使设置生效:

[root@master1 kernel]# sysctl -p

4、主机免密钥登录

免密钥登录不是必须的,配置免密钥是为了后面在节点之间拷贝数据方便,在任意一个master主机上设置到其它所有集群节点的无密码登录,这里选择master1节点,操作过程如下:

[root@master1 ~]# ssh-keygen

[root@master1 ~]# ssh-copy-id [email protected]

[root@master1 ~]# ssh-copy-id [email protected]

[root@master1 ~]# ssh-copy-id [email protected]

[root@master1 ~]# ssh-copy-id [email protected]

[root@master1 ~]# ssh-copy-id

[email protected]

[root@master1 ~]# ssh-copy-id [email protected]

配置完成,在master1节点进行无密码登录其它节点的测试,看是否有问题。

5、主机名解析配置

每个主机的主机名以及IP地址都在上面环境介绍中给出来了,根据这些信息,在每个k8s集群节点添加如下主机名解析信息,将这些信息添加到每个集群节点的/etc/hosts文件中,主机名解析内容如下:

172.16.213.225  master1

172.16.213.229  master2

172.16.213.230  master3

172.16.213.231  node1

172.16.213.235  node2

172.16.213.236  lbserver

三、给k8s组件签发证书

1、获取证书签发工具

这里我们需要用到用到cfssl工具和cfssljson工具,下面简单介绍下CFSSL,CFSSL是一款开源的PKI/TLS工具。 CFSSL包含一个命令行工具和一个用于签名、验证并且捆绑TLS证书的HTTP API服务。 使用Go语言编写。

CFSSL包括:

l 一组用于生成自定义TLS PKI的工具

l cfssl程序,是CFSSL的命令行工具

l multirootca程序是可以使用多个签名密钥的证书颁发机构服务器

l mkbundle程序用于构建证书池

l cfssljson程序,从cfssl和multirootca程序获取JSON输出,并将证书,密钥,CSR和bundle写入磁盘

这里我们只用到cfssl和cfssljson工具,大家可从

https://github.com/cloudflare/cfssl/releases/

下载相应的版本,这里我下载的是1.5.0版本。

[root@master1 setup]# 

https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64

[root@master1 setup]# mv cfssl_1.5.0_linux_amd64  /usr/local/bin/cfssl

[root@master1 setup]# mv cfssljson_1.5.0_linux_amd64 /usr/local/bin/cfssljson

接下来,就可以签发证书了,需要签发证书的组件有admin用户、kube-controller-manager、kubelet、kube-proxy、kube-scheduler和kube-api。

2、创建CA证书

(1)、创建证书生成策略文件

配置证书生成策略,让CA软件知道颁发有什么功能的证书。先创建一个json格式文件ca-config.json,内容如下:

[root@master1 k8s]# cat ca-config.json

{

  "signing": {

    "default": {

      "expiry": "87600h"

    },

    "profiles": {

      "kubernetes": {

        "usages": ["signing", "key encipherment", "server auth", "client auth"],

        "expiry": "87600h"

      }

    }

  }

这个策略,有一个default默认的配置,和一个profiles,profiles可以设置多个profile,这里的profile是etcd。

default默认策略,指定了证书的默认有效期是一年(8760h)。

kubernetes:表示该配置(profile)的用途是为kubernetes生成证书及相关的校验工作。

signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE。

server auth:表示可以用该CA 对 server 提供的证书进行验证。

client auth:表示可以用该 CA 对 client 提供的证书进行验证。

expiry:也表示过期时间,如果不写以default中的为准。

我这里将证书有效期设置为10年。

(2)、创建CA证书签名请求文件

创建一个json格式文件ca-csr.json,内容如下:

[root@master1 k8s]# cat ca-csr.json

  "CN": "Kubernetes",

  "key": {

    "algo": "rsa",

    "size": 2048

  },

  "names": [

    {

      "C": "CN",

      "L": "xian",

      "O": "iivey",

      "OU": "CA",

      "ST": "shaanxi"

  ]

}

参数含义如下:

Ø CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。

Ø key:生成证书的算法

Ø hosts:表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用(本例中没有hosts字段)

Ø names:一些其它的属性

² C: Country, 国家

² ST: State,州或者是省份

² L: Locality Name,地区,城市

² O: Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)

² OU: Organization Unit Name,组织单位名称,公司部门

在这个文件中,可根据情况进行地域、国家的修改。

(3)、产生CA证书文件

执行如下命令:

[root@master1 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca

其中,几个参数功能如下:

Ø gencert: 生成新的key(密钥)和签名证书

² -initca:初始化一个新ca

该命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。接着,查看产生的证书文件:

[root@master1 k8s]#  ls -al ca*.pem

-rw-------  1 root root 1675 Mar 23 11:04 ca-key.pem

-rw-r--r--  1 root root 1314 Mar 23 11:04 ca.pem

这两个文件就是我们需要的证书文件。如果要查看cert(证书信息),可执行如下命令:

[root@master1 k8s]# cfssl certinfo -cert ca.pem

要查看CSR(证书签名请求)信息,可执行如下文件:

[root@master1 k8s]# cfssl certinfo -csr ca.csr

3、创建admin用户证书

(1)、创建证书签名请求配置文件

创建一个json格式文件admin-csr.json,内容如下:

[root@master1 k8s]# cat  admin-csr.json

  "CN": "admin",

      "O": "system:masters",

      "OU": "Kubernetes The Hard Way",

(2)、创建admin用户证书并校验结果

首先创建admin证书,执行如下命令:

[root@master1 k8s]# cfssl gencert \

  -ca=ca.pem \

  -ca-key=ca-key.pem \

  -config=ca-config.json \

  -profile=kubernetes \

  admin-csr.json | cfssljson -bare admin

其中,每个参数含义如下:

² -ca:指明ca的证书

² -ca-key:指明ca的私钥文件

² -config:指明请求证书的json文件

² -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息

接着,查看产生的证书文件:

[root@master1 k8s]# ls -al admin*.pem

-rw------- 1 root root 1675 Dec  2 10:12 admin-key.pem

-rw-r--r-- 1 root root 1411 Dec  2 10:12 admin.pem

这两个就是需要的证书文件。

4、创建kubelet证书

Kubelet证书主要是在node节点使用的,这里我们有node1、node2两个节点,因此需要创建两个节点的Kubelet证书,为了方便起见,这里通过一个脚本一次性实现两个节点证书的创建,脚本generate-kubelet-certificate.sh内容如下:

[root@master1 k8s]# more generate-kubelet-certificate.sh

IFS=$'\n'

for line in `cat node.txt`; do

instance=`echo $line | awk '{print $1}'`

INTERNAL_IP=`echo $line | awk '{print $2}'`

cat > ${instance}-csr.json <<EOF

  "CN": "system:node:${instance}",

      "O": "system:nodes",

EOF

cfssl gencert \

  -hostname=${instance},${INTERNAL_IP} \

  ${instance}-csr.json | cfssljson -bare ${instance}

其中,node.txt文件内容如下:

[root@master1 k8s]# cat node.txt

node1   172.16.213.231

node2   172.16.213.235

执行generate-kubelet-certificate.sh这个脚本,会生成node1、node2两个节点的证书文件。

[root@master1 k8s]# ll node*.pem

-rw------- 1 root root 1679 Dec  2 10:41 node1-key.pem

-rw-r--r-- 1 root root 1464 Dec  2 10:41 node1.pem

-rw------- 1 root root 1675 Dec  2 10:41 node2-key.pem

-rw-r--r-- 1 root root 1464 Dec  2 10:41 node2.pem

5、创建Controller Manager客户端证书

Controller Manager证书是在master节点,为了方便起见,我们通过一个脚本来自动完成证书的创建,脚本kube-controller-manager.sh内容如下:

[root@master1 k8s]# more kube-controller-manager.sh

cat > kube-controller-manager-csr.json <<EOF

  "CN": "system:kube-controller-manager",

      "O": "system:kube-controller-manager",

  kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager

执行kube-controller-manager.sh这个脚本,会生成两个证书文件。

[root@master1 k8s]# ll kube-controller-manager*.pem

-rw------- 1 root root 1679 Dec  2 10:43 kube-controller-manager-key.pem

-rw-r--r-- 1 root root 1468 Dec  2 10:43 kube-controller-manager.pem

6、创建Kube Proxy客户端证书

Kube Proxy证书是在master节点,为了方便起见,我们通过一个脚本来自动完成证书的创建,脚本kubeproxy.sh内容如下: 

cat > kube-proxy-csr.json <<EOF

  "CN": "system:kube-proxy",

      "O": "system:node-proxier",

  kube-proxy-csr.json | cfssljson -bare kube-proxy

执行kubeproxy.sh这个脚本,会生成两个证书文件。

[root@master1 k8s]# ll kube-proxy*.pem

-rw------- 1 root root 1675 Dec  2 10:45 kube-proxy-key.pem

-rw-r--r-- 1 root root 1436 Dec  2 10:45 kube-proxy.pem

7、创建Scheduler 客户端证书

Kube Scheduler证书是在master节点,为了方便起见,我们通过一个脚本来自动完成证书的创建,脚本kubescheduler.sh内容如下:

[root@master1 k8s]# more kubescheduler.sh

cat > kube-scheduler-csr.json <<EOF

  "CN": "system:kube-scheduler",

      "O": "system:kube-scheduler",

  kube-scheduler-csr.json | cfssljson -bare kube-scheduler

执行kubescheduler.sh这个脚本,会生成两个证书文件。

[root@master1 k8s]#  ll kube-scheduler*.pem

-rw------- 1 root root 1679 Dec  2 10:47 kube-scheduler-key.pem

-rw-r--r-- 1 root root 1444 Dec  2 10:47 kube-scheduler.pem

8、创建Kuberenetes API证书

kube-api服务器证书主机名应该包含所有控制器的主机名和IP、负载均衡器的主机名和IP、kubernetes服务以及localhost。

为了方便起见,我们通过一个脚本来自动完成证书的创建,脚本kubeapi.sh内容如下:

CERT_HOSTNAME=10.100.0.1,master1,172.16.213.225,master2,172.16.213.229,master3,172.16.213.230,lbserver,172.16.213.236,127.0.0.1,localhost,kubernetes.default

cat > kubernetes-csr.json <<EOF

  "CN": "kubernetes",

      "O": "Kubernetes",

  -hostname=${CERT_HOSTNAME} \

  kubernetes-csr.json | cfssljson -bare kubernetes

注意,此脚本中,CERT_HOSTNAME的内容,需要修改为你环境下的主机名和IP地址。

执行kubeapi.sh这个脚本,会生成两个证书文件。

[root@master1 k8s]# ll kubernetes*.pem

-rw------- 1 root root 1679 Dec  3 17:45 kubernetes-key.pem

-rw-r--r-- 1 root root 1574 Dec  3 17:45 kubernetes.pem

9、创建服务帐户密钥对

服务帐户密钥对用来签署服务帐户的token,为了方便起见,我们通过一个脚本来自动完成证书的创建,脚本servicesaccount.sh内容如下:

[root@master1 k8s]# cat servicesaccount.sh

cat > service-account-csr.json  <<EOF

  "CN": "service-accounts",

  service-account-csr.json | cfssljson -bare service-account

执行servicesaccount.sh这个脚本,会生成两个证书文件。

[root@master1 k8s]# ll service-account*.pem

-rw------- 1 root root 1679 Dec  3 17:46 service-account-key.pem

-rw-r--r-- 1 root root 1424 Dec  3 17:46 service-account.pem

10、复制证书到对应节点

基础证书到此已经基本创建完成了,接下来要将证书传到集群的相应节点上,为了方便起见,通过一个脚本来完成证书的传输,脚本scp1.sh的内容如下:

[root@master1 k8s]# cat scp1.sh

   instance=`echo $line | awk '{print $1}'`

   rsync -azvp ca.pem ${instance}-key.pem ${instance}.pem root@${instance}:/root/

for instance in master1 master2 master3; do

   rsync -avpz ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem service-account-key.pem service-account.pem root@${instance}:/root/

注意,此脚本是将k8s集群两个node节点的证书传到对应node主机上,然后将ca证书、kube-api证书以及service-account证书传到三个master节点上。

其中,脚本中的node.txt文件内容如下:

[root@master1 k8s]# more node.txt

四、给k8s组件创建kubeconfig

kubeconfig是kubernetes集群中各个组件连入api-server的时候, 使用的客户端配置文件。用于配置集群访问的文件称为kubeconfig文件。这是引用配置文件的通用方法。这并不意味着有一个名为 kubeconfig 的文件。

使用 kubeconfig 文件来组织有关集群、用户、命名空间和身份认证机制的信息。kubectl 命令行工具使用 kubeconfig 文件来查找选择集群所需的信息,并与集群的 API 服务器进行通信。

默认情况下,kubectl 在 $HOME/.kube 目录下查找名为 config 的文件。 我们也可以通过设置 KUBECONFIG 环境变量或者设置--kubeconfig参数来指定其他 kubeconfig 文件。

本文中我们将生成多个组件的kubeconfig,分别是kubelet kubeconfig、kube Proxy kubeconfig、Controller Manager kubeconfig、Kube Scheduler kubeconfig、`admin`用户的kubeconfig。

1、 生成kubelet的kubeconfig

首先需要安装kubectl,这是管理k8s的一个客户端工具,下载地址如下:

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#downloads-for-v1204

这里下载的kubernetes版本为kubernetes-server-linux-amd64.tar.gz,建议下载二进制的server版本,这样下载后,解压即可使用。将上面这个压缩包解压,得到kubernetes/server/bin这个路径,就可以找到一个二进制文件kubectl,将这个文件拷贝到master节点的/usr/local/bin目录下即可。此步骤需要在三个master节点进行,基本操作过程如下:

[root@master1 bin]# chmod 755 kubectl

[root@master1 bin]# cp kubectl /usr/local/bin

[root@master1 bin]# scp kubectl  master2:/usr/local/bin

[root@master1 bin]# scp kubectl  master3:/usr/local/bin

kubectl文件拷贝完成,接下来就可以生成kubeconfig文件了,为了方便起见,仍然使用一个脚本kubelet.sh完成,脚本内容如下:

[root@master1 k8s]# more kubelet.sh  

for instance in node1 node2; do

# 设置集群参数

  kubectl config set-cluster kubernetes-the-hard-way \

    --certificate-authority=ca.pem \

    --embed-certs=true \

    --server=https://172.16.213.236:6443 \

    --kubeconfig=${instance}.kubeconfig

# 设置客户端认证参数

  kubectl config set-credentials system:node:${instance} \

    --client-certificate=${instance}.pem \

    --client-key=${instance}-key.pem \

# 设置上下文参数

  kubectl config set-context default \

    --cluster=kubernetes-the-hard-way \

    --user=system:node:${instance} \

# 设置默认上下文

  kubectl config use-context default --kubeconfig=${instance}.kubeconfig

此段配置中,主要有三个方面的配置,分别是:

(1)、集群参数

本段设置了所需要访问的集群的信息。使用set-cluster设置了需要访问的集群,如上为kubernetes-the-hard-way,这只是个名称,实际为--server指向的apiserver,--certificate-authority设置了该集群的公钥,--embed-certs为true表示将--certificate-authority证书写入到kubeconfig中;--server则表示该集群的kube-apiserver地址。

注意,这里--server指定的apiserver地址是个负载均衡的地址,因为此环境是三个master节点的集群环境,所以要指向负载均衡器的IP地址。关于负载均衡器的配置,将在下面做具体介绍。

生成的kubeconfig 如果不指定路径,默认被保存到 ~/.kube/config 文件,而上面的配置中,我们指定的路径是当前目录,所以会在当前目录下生成kubeconfig文件。

(2)、客户端参数

本段主要设置客户端的相关信息,注意客户端的证书首先要经过集群CA的签署,否则不会被集群认可。此处使用的是ca认证方式,也可以使用token认证. 

(3)、上下文参数

集群参数和用户参数可以同时设置多对,在上下文参数中将集群参数和用户参数关联起来。上面的上下文名称为default,--cluster为kubernetes-the-hard-way,用户为system:node:${instance},表示使用system:node的用户凭证来访问kubernetes-the-hard-way集群的default命名空间,也可以增加--namspace来指定访问的命名空间。

最后使用kubectl config use-context default 来使用名为default的环境项来作为配置。如果配置了多个环境项,可以通过切换不同的环境项名字来访问到不同的集群环境。

执行kubelet.sh脚本,就会生成两个node节点的kubeconfig文件,操作如下:

[root@master1 k8s]# sh kubelet.sh

[root@master1 k8s]# ll node*.kubeconfig

-rw------- 1 root root 6314 Dec  2 16:22 node1.kubeconfig

-rw------- 1 root root 6310 Dec  2 16:22 node2.kubeconfig

2、生成kube-proxy 的kubeconfig

为了方便起见,仍然使用一个脚本kube-proxy.sh完成,脚本内容如下:

kubectl config set-cluster kubernetes-the-hard-way \

    --kubeconfig=kube-proxy.kubeconfig

kubectl config set-credentials system:kube-proxy \

    --client-certificate=kube-proxy.pem \

    --client-key=kube-proxy-key.pem \

kubectl config set-context default \

    --user=system:kube-proxy \

kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

脚本的内容不再解释,跟kubelet.sh脚本中的参数含义基本相同,执行此脚本,会生成kube-proxy的kubeconfig文件,操作如下:

[root@master1 k8s]# sh kube-proxy.sh   

[root@master1 k8s]# ll kube-proxy*.kubeconfig

-rw------- 1 root root 6274 Dec  2 16:27 kube-proxy.kubeconfig

3、创建kue-controller-manager kubeconfig

为了方便起见,仍然使用一个脚本kube-controllermanager.sh完成,脚本内容如下:

[root@master1 k8s]# vi kube-controllermanager.sh

    --server=https://127.0.0.1:6443 \

    --kubeconfig=kube-controller-manager.kubeconfig

kubectl config set-credentials system:kube-controller-manager \

    --client-certificate=kube-controller-manager.pem \

    --client-key=kube-controller-manager-key.pem \

    --user=system:kube-controller-manager \

kubectl config use-context default --kubeconfig=kube-controller-manager.kubeconfig

执行此脚本,会生成kube-proxy的kubeconfig文件,操作如下:

[root@master1 k8s]#  sh kube-controllermanager.sh

[root@master1 k8s]# ll kube-controller-manager*.kubeconfig

-rw------- 1 root root 6343 Dec  2 17:51 kube-controller-manager.kubeconfig

4、生成kube-scheduler kubeconfig

为了方便起见,仍然使用一个脚本kube-scheduler.sh完成,脚本内容如下:

[root@master1 k8s]# cat kube-scheduler.sh

    --kubeconfig=kube-scheduler.kubeconfig

kubectl config set-credentials system:kube-scheduler \

    --client-certificate=kube-scheduler.pem \

    --client-key=kube-scheduler-key.pem \

    --user=system:kube-scheduler \

kubectl config use-context default --kubeconfig=kube-scheduler.kubeconfig

执行此脚本,会生成kube-scheduler的kubeconfig文件,操作如下:

[root@master1 k8s]# sh kube-scheduler.sh

[root@master1 k8s]# ll kube-scheduler*.kubeconfig

-rw------- 1 root root 6293 Dec  2 16:54 kube-scheduler.kubeconfig

5、生成admin的kubeconfig

为了方便起见,仍然使用一个脚本admin.sh完成,脚本内容如下:

[root@master1 k8s]# cat admin.sh

    --kubeconfig=admin.kubeconfig

kubectl config set-credentials admin \

    --client-certificate=admin.pem \

    --client-key=admin-key.pem \

    --user=admin \

kubectl config use-context default --kubeconfig=admin.kubeconfig

执行此脚本,会生成admin的kubeconfig文件,操作如下:

[root@master1 k8s]# sh admin.sh

[root@master1 k8s]# ll admin.kubeconfig

-rw------- 1 root root 6213 Dec  2 16:55 admin.kubeconfig

6、创建通信加密文件

Kubernetes支持集群数据加密。在下面操作中,我们将生成一个加密密钥和加密配置来加密Kubernetes静态Secret数据。

这里仍然通过一个脚本encryption-config.sh来完成,脚本内容如下:

[root@master1 ~]# more encryption-config.sh

cat > encryption-config.yaml <<EOF

kind: EncryptionConfig

apiVersion: v1

resources:

  - resources:

      - secrets

    providers:

      - aescbc:

          keys:

            - name: key1

              secret: $(head -c 32 /dev/urandom | base64)

      - identity: {}

执行这个脚本,然后会生成一个文件encryption-config.yaml,此文件需要复制到三个master节点。

7、拷贝kubeconfig到集群节点

到这里为止,所需要的证书、kubeconfig文件已经全部生成完毕,接下来需要将这些文件拷贝到集群对应的主机上。

首先需要将kube-proxy.kubeconfig以及${node}.kubeconfig拷贝到集群的两个work节点,接着将admin.kubeconfig、kube-controller-manager.kubeconfig、kube-scheduler.kubeconfig、encryption-config.yaml拷贝到k8s集群的三个master节点,这通过一个脚本即可完成,脚本kubeconfig-scp.sh内容如下:

[root@master1 k8s]# more kubeconfig-scp.sh 

IFS=$'\n' 

for line in node1 node2; do

  rsync -avpz ${line}.kubeconfig kube-proxy.kubeconfig root@${line}:/root/

  rsync -avpz admin.kubeconfig kube-controller-manager.kubeconfig kube-scheduler.kubeconfig root@${instan

ce}:/root/

rsync -avpz encryption-config.yaml root@${instance}:/root/

注意,脚本中node1/node2以及master1/2/3都是k8s集群的主机名。另外,脚本中的文件都在当前目录下,写的相当路径,当前目录为/root/k8s。另外,将文件拷贝到其他节点时,也是暂存到/root目录下的,后面在其它节点安装软件后,还需要把这些文件拷贝到对应的配置目录下。

五、Etcd集群配置

Etcd可以单独部署,也可以部署为集群模式,在生产环境下,建议部署为集群模式,集群模式下至少需要3台机器,这三台机器可以单独部署,也可以和三个master节点公用,这取决于机器资源十分充足。

下面我们将etcd和master部署到一起,因此,下面每个步骤的操作都需要在maser1、maser2、maser3执行一遍。

1、部署etcd文件

Etcd程序可以从

https://github.com/etcd-io/etcd/releases/

下载,这里我下载的是最新版本etcd-v3.4.14-linux-amd64.tar.gz,下载完成后进行解压,然后创建相应目录并复制配置文件过来完成配置,操作过程如下:

[root@master1 k8s]# tar -xvf etcd-v3.4.14-linux-amd64.tar.gz

[root@master1 k8s]# cp etcd-v3.4.14-linux-amd64/etcd* /usr/local/bin/

[root@master1 k8s]# scp etcd-v3.4.14-linux-amd64/etcd* master2:/usr/local/bin/

[root@master1 k8s]# scp etcd-v3.4.14-linux-amd64/etcd* master3:/usr/local/bin/

[root@master1 k8s]# mkdir -p /etc/etcd /var/lib/etcd

[root@master1 k8s]# cp  ca.pem kubernetes-key.pem kubernetes.pem /etc/etcd/

[root@master1 k8s]#scp  ca.pem kubernetes-key.pem kubernetes.pem master2:/etc/etcd/

[root@master1 k8s]#scp  ca.pem kubernetes-key.pem kubernetes.pem master3:/etc/etcd/

注意,最后两个步骤是先创建etcd几个配置文件目录,然后将之前生成的证书文件拷贝到这些目录中。

2、 创建etcd服务配置文件

服务配置文件主要用来管理etcd服务,例如启动、关闭等,为方便起见,通过一个脚本完成,脚本etcd.sh内容如下:

[root@master1 k8s]# cat  etcd.sh

ETCD_NAME=`hostname`

INTERNAL_IP=`hostname -i`

INITIAL_CLUSTER=master1=https://172.16.213.225:2380,master2=https://172.16.213.229:2380,master3=https://172.16.213.230:2380

cat << EOF | sudo tee /etc/systemd/system/etcd.service

[Unit]

Description=etcd

Documentation=https://github.com/coreos

[Service]

ExecStart=/usr/local/bin/etcd \\

  --name ${ETCD_NAME} \\

  --cert-file=/etc/etcd/kubernetes.pem \\

  --key-file=/etc/etcd/kubernetes-key.pem \\

  --peer-cert-file=/etc/etcd/kubernetes.pem \\

  --peer-key-file=/etc/etcd/kubernetes-key.pem \\

  --trusted-ca-file=/etc/etcd/ca.pem \\

  --peer-trusted-ca-file=/etc/etcd/ca.pem \\

  --peer-client-cert-auth \\

  --client-cert-auth \\

  --initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\

  --listen-peer-urls https://${INTERNAL_IP}:2380 \\

  --listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\

  --advertise-client-urls https://${INTERNAL_IP}:2379 \\

  --initial-cluster-token etcd-cluster-0 \\

  --initial-cluster ${INITIAL_CLUSTER} \\

  --initial-cluster-state new \\

  --data-dir=/var/lib/etcd

Restart=on-failure

RestartSec=5

[Install]

WantedBy=multi-user.target

在三个master节点上执行此脚本,会自动生成服务配置文件etcd.service,后面会调用此文件来启动或重启etcd服务。

3、 启动并测试etcd集群服务

要启动etcd集群服务,可通过执行如下命令实现:

[root@master1 k8s]#  systemctl daemon-reload

[root@master1 k8s]#  systemctl enable etcd

[root@master1 k8s]#  systemctl start etcd

要测试etcd集群是否正常运行,可执行如下命令:

[root@master1 k8s]# ETCDCTL_API=3 etcdctl member list   --endpoints=https://127.0.0.1:2379   --cacert=/etc/etcd/ca.pem   --cert=/etc/etcd/kubernetes.pem   --key=/etc/etcd/kubernetes-key.pem

至此,etcd集群安装完成。

六、k8s集群master节点各组件部署

下面正式进入k8s集群部署阶段,首先部署的是master节点各组件,主要有kube-apiserver、kube-controller-manager、kube-scheduler三个组件的安装部署。

1、部署master节点组件

要安装k8s集群组件,首先需要从github上下载Kubernetes的安装程序,可选择源码和二进制版本下载,建议选择二进制版本下载。

下载地址为:

,我这里下载的是kubernetes1.20.4版本,对应的程序包为kubernetes-server-linux-amd64.tar.gz。

将下载好的程序包进行解压,然后在kubernetes/server/bin目录下即可找到需要的组件程序,先进行授权,然后传到/usr/local/bin目录下。操作如下:

[root@master1 setup]# cd kubernetes/server/bin

[root@master1 bin]# chmod +x kube-apiserver kube-controller-manager kube-scheduler kubectl

[root@master1 bin]# cp kube-apiserver kube-controller-manager kube-scheduler /usr/local/bin/

[root@master1 bin]# scp kube-apiserver kube-controller-manager kube-scheduler master2:/usr/local/bin/

[root@master1 bin]# scp  kubectl kubelet kube-proxy  node1:/usr/local/bin/

[root@master1 bin]# scp  kubectl kubelet kube-proxy  node2:/usr/local/bin/

此操作在三个master节点都执行一遍,即可完成master节点组件的安装。同时也将客户端node1、node2所需的软件也一并拷贝过去。

2、Kubernetes API服务配置

首先,需要移动证书到Kubernetes对应目录,操作如下:

[root@master1 k8s]# mkdir -p /var/lib/kubernetes/

[root@master1 k8s]# cp  ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \

    service-account-key.pem service-account.pem \

    encryption-config.yaml /var/lib/kubernetes/

下面是拷贝证书到master2、3节点:

[root@master1 k8s]# scp  ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \

    encryption-config.yaml  master2:/var/lib/kubernetes/

    encryption-config.yaml  master3:/var/lib/kubernetes/

接着,创建kube-api服务的配置文件,为了方便起见,通过一个脚本来实现,脚本kube-api.sh内容如下:

[root@master1 k8s]# cat  kube-api.sh

CONTROLLER0_IP=172.16.213.225

CONTROLLER1_IP=172.16.213.229

CONTROLLER2_IP=172.16.213.230

cat << EOF | sudo tee /etc/systemd/system/kube-apiserver.service

Description=Kubernetes API Server

Documentation=https://github.com/kubernetes/kubernetes

ExecStart=/usr/local/bin/kube-apiserver \\

  --advertise-address=${INTERNAL_IP} \\

  --allow-privileged=true \\

  --apiserver-count=3 \\

  --audit-log-maxage=30 \\

  --audit-log-maxbackup=3 \\

  --audit-log-maxsize=100 \\

  --audit-log-path=/var/log/audit.log \\

  --authorization-mode=Node,RBAC \\

  --bind-address=0.0.0.0 \\

  --client-ca-file=/var/lib/kubernetes/ca.pem \\

  --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \\

  --etcd-cafile=/var/lib/kubernetes/ca.pem \\

  --etcd-certfile=/var/lib/kubernetes/kubernetes.pem \\

  --etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \\

  --etcd-servers=https://$CONTROLLER0_IP:2379,https://$CONTROLLER1_IP:2379,https://$CONTROLLER2_IP:2379 \\

  --event-ttl=1h \\

  --encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\

  --kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \\

  --kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \\

  --kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \\

  --kubelet-https=true \\

  --runtime-config=api/all=true \\

  --service-account-key-file=/var/lib/kubernetes/service-account.pem \\

  --service-account-signing-key-file=/var/lib/kubernetes/service-account-key.pem \\

--service-account-issuer=https://${INTERNAL_IP}:6443/auth/realms/master/.well-known/openid-configuration \\

  --service-cluster-ip-range=10.100.0.0/24 \\

  --service-node-port-range=30000-32767 \\

  --tls-cert-file=/var/lib/kubernetes/kubernetes.pem \\

  --tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \\

  --v=2 \\

  --kubelet-preferred-address-types=InternalIP,InternalDNS,Hostname,ExternalIP,ExternalDNS

在三个master节点依次执行此脚本,会生成/etc/systemd/system/kube-apiserver.service文件。

3、Kubernetes Controller Manager配置

首先需要移动kubeconfig文件到kubernetes目录,执行如下命令:

[root@master1 k8s]# cp  kube-controller-manager.kubeconfig /var/lib/kubernetes/

[root@master1 k8s]# scp  kube-controller-manager.kubeconfig master2:/var/lib/kubernetes/

[root@master1 k8s]# scp  kube-controller-manager.kubeconfig master3:/var/lib/kubernetes/

然后,创建kube-controller-manager服务配置文件,为方便起见,仍通过一个脚本controller-manager.sh来实现,脚本内容如下:

[root@master1 k8s]# cat controller-manager.sh

cat <<EOF | sudo tee /etc/systemd/system/kube-controller-manager.service

Description=Kubernetes Controller Manager

ExecStart=/usr/local/bin/kube-controller-manager \\

  --address=0.0.0.0 \\

  --cluster-cidr=10.200.0.0/16 \\

  --cluster-name=kubernetes \\

  --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\

  --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\

  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\

  --leader-elect=true \\

  --root-ca-file=/var/lib/kubernetes/ca.pem \\

  --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\

  --use-service-account-credentials=true \\

  --allocate-node-cidrs=true \

  --cluster-cidr=10.100.0.0/16 \

  --v=2

执行此脚本,会生成/etc/systemd/system/kube-controller-manager.service文件。

4、Kubernetes Scheduler配置

配置之前,先需要将kube-scheduler的kubeconfig文件移动到kubernetes目录,然后创建kube-scheduler配置文件,最后,创建kube-scheduler服务配置文件。

[root@master1 k8s]# cp kube-scheduler.kubeconfig /var/lib/kubernetes/

[root@master1 k8s]#scp kube-scheduler.kubeconfig master2:/var/lib/kubernetes/

[root@master1 k8s]#scp kube-scheduler.kubeconfig master3:/var/lib/kubernetes/

[root@master1 k8s]# mkdir -p /etc/kubernetes/config

[root@master1 k8s]#scp admin.kubeconfig master2:/etc/kubernetes/

[root@master1 k8s]#scp admin.kubeconfig master3:/etc/kubernetes/

目录创建完成后,最后通过脚本完成kube-scheduler配置文件和服务文件的创建,脚本scheduler.sh内容如下:

[root@master1 k8s]# cat  scheduler.sh

cat <<EOF | tee /etc/kubernetes/config/kube-scheduler.yaml

apiVersion: kubescheduler.config.k8s.io/v1beta1

kind: KubeSchedulerConfiguration

clientConnection:

  kubeconfig: "/var/lib/kubernetes/kube-scheduler.kubeconfig"

leaderElection:

  leaderElect: true

cat <<EOF | tee /etc/systemd/system/kube-scheduler.service

Description=Kubernetes Scheduler

ExecStart=/usr/local/bin/kube-scheduler \\

  --config=/etc/kubernetes/config/kube-scheduler.yaml \\

此脚本执行后,会创建kube-scheduler.yaml和kube-scheduler.service两个文件。

5、启动各组件服务

到这里为止,master节点上相关组件的配置和服务文件都配置完成了,下面就可以启动服务了,执行如下命令启动三个服务:

[root@master1 k8s]# systemctl daemon-reload

[root@master1 k8s]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler

[root@master1 k8s]# systemctl start kube-apiserver kube-controller-manager kube-scheduler

服务启动完毕后,使用以下命令检查各个组件的状态:

[root@master1 k8s]# kubectl get cs --kubeconfig admin.kubeconfig

Warning: v1 ComponentStatus is deprecated in v1.19+

NAME                 STATUS    MESSAGE             ERROR

scheduler            Healthy   ok                  

controller-manager   Healthy   ok                  

etcd-2               Healthy   {"health":"true"}   

etcd-0               Healthy   {"health":"true"}   

etcd-1               Healthy   {"health":"true"}  

从输出可在,服务正常,etcd集群也运行正常。

此时,如果直接在master节点运行kubectl  get cs会得到如下错误:

[root@master1 ~]# kubectl  get node

The connection to the server localhost:8080 was refused - did you specify the right host or port?

这是因为kubectl命令需要使用kubernetes-admin来运行,解决方法有两种,第一种是执行如下操作:

mkdir -p $HOME/.kube

cp -i admin.kubeconfig $HOME/.kube/config

chown $(id -u):$(id -g) $HOME/.kube/config

第二种方法是执行如下操作:

echo "export KUBECONFIG=/etc/kubernetes/admin.kubeconfig" >> ~/.bash_profile

source ~/.bash_profile

然后就可以正常执行kubectl命令了。

以上操作在三个master节点都执行一遍。

6、配置RBAC的授权

将下来配置RBAC的授权,来允许kube-api server去访问在每个worker节点上kubelet API. 访问kubelet API主要是用来检索度量,日志和执行Pods中的命令等。

此过程主要分为两个步骤,分别是创建`system:kube-apiserver-to-kubelet`集群角色,并附与权限去访问kubelet,然后绑定`system:kube-apiserver-to-kubelet`集群角色到kubernetes用户。这个过程通过一个脚本来完成,脚本kube-apiserver-to-kubelet.sh内容如下:

[root@master1 k8s]# cat  kube-apiserver-to-kubelet.sh   

cat <<EOF | kubectl apply --kubeconfig admin.kubeconfig -f -

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

  annotations:

    rbac.authorization.kubernetes.io/autoupdate: "true"

  labels:

    kubernetes.io/bootstrapping: rbac-defaults

  name: system:kube-apiserver-to-kubelet

rules:

  - apiGroups:

      - ""

    resources:

      - nodes/proxy

      - nodes/stats

      - nodes/log

      - nodes/spec

      - nodes/metrics

    verbs:

      - "*"

kind: ClusterRoleBinding

  name: system:kube-apiserver

  namespace: ""

roleRef:

  apiGroup: rbac.authorization.k8s.io

  kind: ClusterRole

subjects:

  - apiGroup: rbac.authorization.k8s.io

    kind: User

    name: kubernetes

此脚本执行完毕,相关授权操作就执行成功了。

7、Kubernetes前端负载均衡器配置

负载均衡主要是针对master节点上面的kube-apiserver服务的。此服务非常关键,如果服务较多,此服务负载就会很高,所以做负载均衡很有必要。

由于我们使用了三个master,因此,负载均衡是针对三个master节点上的kube-apiserver服务,这里我采用haproxy来实现三个master节点kube-apiserver服务的负载均衡,这里我单独找一台主机来部署haproxy,haproxy机器就是之前环境说明中的lbserver主机,haproxy的安装可以采用容器方式,也可以直接在物理机上安装,这里直接在物理机上安装,安装通过yum来实现即可。 

安装方式如下:

[root@lbserver ~]# yum install -y  haproxy

安装完成后,需要配置haproxy,默认的配置文件为/etc/haproxy/haproxy.cfg,修改后的配置文件内容如下:

[root@lbserver ~]# more /etc/haproxy/haproxy.cfg

frontend frontend-k8s-api

  bind 172.16.213.236:6443

  bind 172.16.213.236:443

  mode tcp

  option tcplog

  default_backend k8s-api

backend k8s-api

  option tcp-check

  balance roundrobin

  default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100

  server k8s-api-1 172.16.213.225:6443 check

  server k8s-api-2 172.16.213.229:6443 check

  server k8s-api-3 172.16.213.230:6443 check

listen admin_stats

        bind 0.0.0.0:9188

        mode http

        log 127.0.0.1 local0 err

        stats refresh 30s

        stats uri /haproxy-status

        stats realm welcome login\ Haproxy

        stats auth admin:admin123

        stats hide-version

        stats admin if TRUE

配置完成后,就可以启动服务了,执行如下命令:

[root@lbserver ~]# systemctl start haproxy

[root@lbserver ~]#systemctl enable haproxy

Haproxy启动成功后,就可以通过haproxy的ip加上端口访问三个master节点的api-server服务了,测试如下:

[root@lbserver ~]#  curl --cacert ca.pem

https://172.16.213.236:6443/version

  "major": "1",

  "minor": "19",

  "gitVersion": "v1.19.4",

  "gitCommit": "d360454c9bcd1634cf4cc52d1867af5491dc9c5f",

  "gitTreeState": "clean",

  "buildDate": "2020-11-11T13:09:17Z",

  "goVersion": "go1.15.2",

  "compiler": "gc",

  "platform": "linux/amd64"

如果有类似如下输出,表示负载均衡配置正常。

七、k8s集群work节点组件配置

以下操作均在k8s集群的两个work节点进行。

1、安装docker引擎

K8s底层默认使用docker引擎,当然也可以使用其它非docekr引擎,例如containerd 和 cri-o等。更专业的应该叫容器运行时。这里使用docker运行时,所以,需要在每个work节点安装docker引擎,基本安装过程如下:

[root@node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

[root@node1 ~]# yum-config-manager --add-repo

https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@node1 ~]# yum makecache fast

[root@node1 ~]# yum -y install docker-ce

接着,创建daemon.json文件,内容如下:

[root@node1 ~]#  more /etc/docker/daemon.json        

  "exec-opts": ["native.cgroupdriver=systemd"]

最后,重启docker服务即可。

 [root@node1 ~]# systemctl  start docker

注意,官方软件源默认启用了最新的软件,如果我们不想安装最新版本,可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,我们可以修改docker-ce.repo文件,开启各种测试版本等。

3、 kubelet配置

在前面我们创建了kubelet的各种证书,这里需要移动证书和kubelet config到相对应的目录,基本操作过程如下:

[root@node1 ~]# mkdir -p /var/lib/kubelet

[root@node1 ~]# mkdir -p /var/lib/kubernetes

[root@node2 ~]# mkdir -p /var/lib/kubelet

[root@node2 ~]# mkdir -p /var/lib/kubernetes

[root@master1 ~]# scp node1-key.pem node1.pem  node1:/var/lib/kubelet/

[root@master1 ~]# scp node1.kubeconfig node1:/var/lib/kubelet/kubeconfig

[root@master1 ~]# scp ca.pem node1:/var/lib/kubernetes/

[root@master1 ~]# scp node2-key.pem node2.pem  node2:/var/lib/kubelet/

[root@master1 ~]# scp node2.kubeconfig  node2:/var/lib/kubelet/kubeconfig

[root@master1 ~]# scp ca.pem node2:/var/lib/kubernetes/

注意,上面操作中使用scp命令从master1节点拷贝证书到node1、node2主机对应目录下。

接着,还需要创建kubelet配置文件以及服务文件,通过一个脚本kubelet-setup.sh来自动完成,脚本内容如下:

[root@node1 ~]# more  kubelet-setup.sh

cat <<EOF | tee /var/lib/kubelet/kubelet-config.yaml

kind: KubeletConfiguration

apiVersion: kubelet.config.k8s.io/v1beta1

authentication:

  anonymous:

    enabled: false

  webhook:

    enabled: true

  x509:

    clientCAFile: "/var/lib/kubernetes/ca.pem"

authorization:

  mode: Webhook

clusterDomain: "cluster.local"

clusterDNS:

  - "10.100.0.10"

podCIDR: "10.100.0.0/16"

#resolvConf: "/run/systemd/resolve/resolv.conf"

runtimeRequestTimeout: "15m"

tlsCertFile: "/var/lib/kubelet/node1.pem"   #这里是node1节点,如果要部署到node2,需要修改这两个证书的名字为node2的证书。

tlsPrivateKeyFile: "/var/lib/kubelet/node1-key.pem"

cat <<EOF | sudo tee /etc/systemd/system/kubelet.service

Description=Kubernetes Kubelet

After=containerd.service

Requires=containerd.service

ExecStart=/usr/local/bin/kubelet \

  --config=/var/lib/kubelet/kubelet-config.yaml \

  --docker=unix:///var/run/docker.sock \

  --docker-endpoint=unix:///var/run/docker.sock \

  --image-pull-progress-deadline=2m \

  --network-plugin=cni \

  --kubeconfig=/var/lib/kubelet/kubeconfig \

  --register-node=true \

  --cgroup-driver=systemd \

将这个脚本拷贝的node1、node2主机下,并做简单修改,然后执行此脚本,即可完成kubelet配置以及服务配置。会生成/var/lib/kubelet/kubelet-config.yaml和/etc/systemd/system/kubelet.service两个文件。

4、 kube-proxy配置

针对kube-proxy的配置,首先需要移动kubeconfig文件到kubernetes目录,操作如下:

[root@node1 ~]# mkdir  -p /var/lib/kube-proxy

[root@node2 ~]# mkdir  -p /var/lib/kube-proxy

然后从master1节点拷贝kube-proxy.kubeconfig到node1、node2节点。

[root@master1 ~]# scp  kube-proxy.kubeconfig  node1:/var/lib/kube-proxy/kubeconfig

[root@master1 ~]# scp  kube-proxy.kubeconfig  node2:/var/lib/kube-proxy/kubeconfig

接着,还需要创建kube-proxy配置文件以及服务文件,通过一个脚本kube-proxy-setup.sh来自动完成,脚本内容如下:

[root@node1 ~]# cat   kube-proxy-setup.sh

cat <<EOF | sudo tee /var/lib/kube-proxy/kube-proxy-config.yaml

kind: KubeProxyConfiguration

apiVersion: kubeproxy.config.k8s.io/v1alpha1

  kubeconfig: "/var/lib/kube-proxy/kubeconfig"

mode: ""

clusterCIDR: "10.100.0.0/16"

cat <<EOF | sudo tee /etc/systemd/system/kube-proxy.service

Description=Kubernetes Kube Proxy

ExecStart=/usr/local/bin/kube-proxy \\

  --config=/var/lib/kube-proxy/kube-proxy-config.yaml

将此脚本拷贝到node1、node2主机上,然后执行此脚本,会生成/var/lib/kube-proxy/kube-proxy-config.yaml和/etc/systemd/system/kube-proxy.service两个文件。

5、 启动kubelet和kube-proxy服务

到此为止,kubelet和kube-proxy的配置都已经完成,下面在集群work节点上分别启动这两个服务,操作如下:

[root@node1 ~]# systemctl daemon-reload

[root@node1 ~]# systemctl enable kubelet kube-proxy

[root@node1 ~]# systemctl start kubelet kube-proxy

服务启动完毕后,可以通过systemctl status查看服务启动状态,如果不正常,会提示相关错误。

6、 部署CNI网络插件

CNI网络用来实现k8s集群不同主机上不同pod的通信,需要在每个work节点安装CNI网络,要部署CNI网络,可从

https://github.com/containernetworking/plugins/releases

下载CNI查看,操作过程如下:

[root@node1 ~]# mkdir /opt/cni/bin /etc/cni/net.d -p

[root@node1 ~]# cd /opt/cni/bin

[root@node1 ~]# wget

https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz

[root@node1 ~]# tar zxvf cni-plugins-linux-amd64-v0.8.7.tgz -C /opt/cni/bin

CNI插件安装完毕后,还需要在任意一个master节点上执行如下操作,将CNI网络与master节点关联起来,操作如下:

[root@master1 ~]# wget

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

将kube-flannel.yml文件下载到本地,然后找到"Network": "10.244.0.0/16", 修改为"Network": "10.100.0.0/16"

最后,在master节点执行如下操作:

[root@node1 ~]# kubectl apply -f kube-flannel.yaml

至此,k8s集群全部部署完成。

要验证k8s集群是否工作正常,可在master节点执行如下命令:

[root@master1 k8s]# kubectl  get node

NAME    STATUS   ROLES    AGE   VERSION

node1   Ready    <none>   49d   v1.19.4

node2   Ready    <none>   49d   v1.19.4

其中node1/2是两个work节点,如果状态均为Ready,表示集群运行正常。

八、测试集群是否正常

1、启用 kubectl 命令的自动补全功能

echo "source <(kubectl completion bash)" >> ~/.bashrc

source ~/.bashrc

1、创建deployment  

kubectl  create   deployment nginx-deployment --image=nginx --dry-run=client -o yaml

2、创建service

kubectl create service nodeport nginx-services --tcp=8080:80 --dry-run=client  -o yaml