程序员

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

作者:admin 2021-07-24 我要评论

一、环境说明 此环境下需要6台主机 主机地址和角色如下表所示 主机名 IP地址 集群角色 master1 172.16.213.225 k8s?master1 master2 172.16.213.229 k8s?master2...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
一、环境说明

此环境下需要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

[root master1 kernel]# ?wget 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 root 172.16.213.225

[root master1?~]# ssh-copy-id root 172.16.213.229

[root master1?~]# ssh-copy-id root 172.16.213.230

[root master1?~]# ssh-copy-id root 172.16.213.231

[root master1?~]# ssh-copy-id root 172.16.213.235

[root master1?~]# ssh-copy-id root 172.16.213.236

?

配置完成 在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

[root master1 setup]#?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 一些其它的属性

2?C: Country 国家

2?ST: State 州或者是省份

2?L: Locality Name 地区 城市

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

2?OU: Organization Unit Name 组织单位名称 公司部门

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

3 、产生CA证书文件

执行如下命令

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

其中 几个参数功能如下

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

2?-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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : system:masters ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

?

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

其中 每个参数含义如下

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

2?-initca 初始化一个新ca

2?-ca 指明ca的证书

2?-ca-key 指明ca的私钥文件

2?-config 指明请求证书的json文件

2?-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} ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : system:nodes ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

EOF

?

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

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

??-profile kubernetes \

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

done

其中 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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

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

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

EOF

?

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

??-profile kubernetes \

??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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : system:node-proxier ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

EOF

?

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

??-profile kubernetes \

??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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : system:kube-scheduler ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

EOF

?

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

??-profile kubernetes \

??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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : Kubernetes ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

?

EOF

?

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

??-hostname ${CERT_HOSTNAME} \

??-profile kubernetes \

??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 ,

?? key : {

???? algo : rsa ,

???? size : 2048

??},

?? names : [

????{

?????? C : CN ,

?????? L : xian ,

?????? O : Kubernetes ,

?????? OU : Kubernetes The Hard Way ,

?????? ST : shaanxi

????}

??]

}

EOF

cfssl gencert \

??-ca ca.pem \

??-ca-key ca-key.pem \

??-config ca-config.json \

??-profile kubernetes \

??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

IFS $ \n

for line in cat node.txt do

???instance echo $line | awk {print $1}

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

done

?

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/

done

?

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

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

[root master1 k8s]# more node.txt

node1 ??172.16.213.231

node2 ??172.16.213.235

?

四、给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 ?

IFS $ \n

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 \

????--embed-certs true \

????--kubeconfig ${instance}.kubeconfig

# 设置上下文参数

??kubectl config set-context default \

????--cluster kubernetes-the-hard-way \

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

????--kubeconfig ${instance}.kubeconfig

# 设置默认上下文

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

done

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

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 \

????--certificate-authority ca.pem \

????--embed-certs true \

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

????--kubeconfig kube-proxy.kubeconfig

?

kubectl config set-credentials system:kube-proxy \

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

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

????--embed-certs true \

????--kubeconfig kube-proxy.kubeconfig

?

kubectl config set-context default \

????--cluster kubernetes-the-hard-way \

????--user system:kube-proxy \

????--kubeconfig kube-proxy.kubeconfig

?

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

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

????--certificate-authority ca.pem \

????--embed-certs true \

????--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 \

????--embed-certs true \

????--kubeconfig kube-controller-manager.kubeconfig

?

kubectl config set-context default \

????--cluster kubernetes-the-hard-way \

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

????--kubeconfig kube-controller-manager.kubeconfig

?

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

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

????--certificate-authority ca.pem \

????--embed-certs true \

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

????--kubeconfig kube-scheduler.kubeconfig

?

kubectl config set-credentials system:kube-scheduler \

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

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

????--embed-certs true \

????--kubeconfig kube-scheduler.kubeconfig

kubectl config set-context default \

????--cluster kubernetes-the-hard-way \

????--user system:kube-scheduler \

????--kubeconfig kube-scheduler.kubeconfig

?

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

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

????--certificate-authority ca.pem \

????--embed-certs true \

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

????--kubeconfig admin.kubeconfig

?

kubectl config set-credentials admin \

????--client-certificate admin.pem \

????--client-key admin-key.pem \

????--embed-certs true \

????--kubeconfig admin.kubeconfig

?

kubectl config set-context default \

????--cluster kubernetes-the-hard-way \

????--user admin \

????--kubeconfig admin.kubeconfig

?

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: {}

EOF

执行这个脚本 然后会生成一个文件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/

done

?

for instance in master1 master2 master3; do

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

ce}:/root/

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

done

?

注意 脚本中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

EOF

在三个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的安装程序 可选择源码和二进制版本下载 建议选择二进制版本下载。

下载地址为

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#downloads-for-v1204 我这里下载的是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?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 \

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

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

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

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

????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

INTERNAL_IP hostname -i

?

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

[Unit]

Description Kubernetes API Server

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

?

[Service]

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

Restart on-failure

RestartSec 5

?

[Install]

WantedBy multi-user.target

EOF

在三个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

[Unit]

Description Kubernetes Controller Manager

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

?

[Service]

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 \\

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

??--use-service-account-credentials true \\

??--allocate-node-cidrs true \

??--cluster-cidr 10.100.0.0/16 \

??--v 2

Restart on-failure

RestartSec 5

?

[Install]

WantedBy multi-user.target

EOF

执行此脚本 会生成/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

EOF

?

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

[Unit]

Description Kubernetes Scheduler

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

?

[Service]

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

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

??--v 2

Restart on-failure

RestartSec 5

?

[Install]

WantedBy multi-user.target

EOF

此脚本执行后 会创建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:

??????- *

EOF

?

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

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

??name: system:kube-apiserver

??namespace:

roleRef:

??apiGroup: rbac.authorization.k8s.io

??kind: ClusterRole

??name: system:kube-apiserver-to-kubelet

subjects:

??- apiGroup: rbac.authorization.k8s.io

????kind: User

????name: kubernetes

EOF

?

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

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

??mode tcp

??option tcplog

??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

EOF

?

?

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

[Unit]

Description Kubernetes Kubelet

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

After containerd.service

Requires containerd.service

?

[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 \

??--v 2

Restart on-failure

RestartSec 5

?

[Install]

WantedBy multi-user.target

EOF

将这个脚本拷贝的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

clientConnection:

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

mode:

clusterCIDR: 10.100.0.0/16

EOF

?

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

[Unit]

Description Kubernetes Kube Proxy

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

?

[Service]

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

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

Restart on-failure

RestartSec 5

?

[Install]

WantedBy multi-user.target

EOF

?

将此脚本拷贝到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

?

?


本文转自网络,原文链接:https://developer.aliyun.com/article/785720

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 二进制安装k8s超详细版本-V1.20

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

  • 浅谈可观测架构模式

    浅谈可观测架构模式

  • LeetCode 154. 寻找旋转排序数组中的最

    LeetCode 154. 寻找旋转排序数组中的最

  • 重磅视频 | 5G将如何改变我们的生活?

    重磅视频 | 5G将如何改变我们的生活?

腾讯云代理商
海外云服务器