此环境下需要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组件创建kubeconfigkubeconfig是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、创建servicekubectl create service nodeport nginx-services --tcp 8080:80 --dry-run client ?-o yaml
?
?
服务器同时在电信和网通双线路接入的情况下就是 双线服务器 ,电信网通双线路自...
背景 随着用户量的增加 后台服务经常需要部署在多台服务器或者集群中来提高性能...
作者 阿里云数据库OLAP产品部 云曦 预计算和缓存是计算机领域提高性能以及降低成...
} No.8 这道题跟第五题很类似,如果看懂了第五题,那么这题肯定是信手拈来??????...
本期导读 【AI 训练加速】第十七讲 主题 FFluid JindoFS 对 HDFS 上的数据进行训...
1. 什么是高精数据分发引擎 1.1?高精地图概述 高精地图(High Definitation Map,H...
怎么创建 微信小程序 ?创建 小程序 的第一步,需要注册一个微信小程序账号。首...
作者 不拔 每年各个部门都要进行规划 规划能让目标更聚焦 让我们清晰地知道今后...
在当前这个数据爆炸的时代,企业数字化程度越高,越会重视数据仓库的应用。对数...
虚拟主机 如何装 SSL ?虚拟主机部署SSL其实是比较简单的,如果已经购买了 SSL证...