经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Kubernetes » 查看文章
二进制安装Kubernetes(k8s)v1.29.2
来源:cnblogs  作者:小陈运维  时间:2024/2/19 9:20:31  对本文有异议

二进制安装Kubernetes(k8s)v1.29.2

https://github.com/cby-chen/Kubernetes 开源不易,帮忙点个star,谢谢了

介绍

kubernetes(k8s)二进制高可用安装部署,支持IPv4+IPv6双栈。

我使用IPV6的目的是在公网进行访问,所以我配置了IPV6静态地址。

若您没有IPV6环境,或者不想使用IPv6,不对主机进行配置IPv6地址即可。

不配置IPV6,不影响后续,不过集群依旧是支持IPv6的。为后期留有扩展可能性。

若不要IPv6 ,不给网卡配置IPv6即可,不要对IPv6相关配置删除或操作,否则会出问题。

强烈建议在Github上查看文档 !!!

Github出问题会更新文档,并且后续尽可能第一时间更新新版本文档 !!!

手动项目地址:https://github.com/cby-chen/Kubernetes

1.环境

主机名称 IP地址 说明 软件
192.168.1.60 外网节点 下载各种所需安装包
Master01 192.168.1.31 master节点 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、
kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Master02 192.168.1.32 master节点 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、
kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Master03 192.168.1.33 master节点 kube-apiserver、kube-controller-manager、kube-scheduler、etcd、
kubelet、kube-proxy、nfs-client、haproxy、keepalived、nginx
Node01 192.168.1.34 node节点 kubelet、kube-proxy、nfs-client、nginx
Node02 192.168.1.35 node节点 kubelet、kube-proxy、nfs-client、nginx
192.168.1.36 VIP

网段
物理主机:192.168.1.0/24
service:10.96.0.0/12
pod:172.16.0.0/12

安装包已经整理好:https://mirrors.chenby.cn/https://github.com/cby-chen/Kubernetes/releases/download/v1.29.2/kubernetes-v1.29.2.tar

1.1.k8s基础系统环境配置

1.2.配置IP

  1. # 注意!
  2. # 若虚拟机是进行克隆的那么网卡的UUID会重复
  3. # 若UUID重复需要重新生成新的UUID
  4. # UUID重复无法获取到IPV6地址
  5. #
  6. # 查看当前的网卡列表和 UUID:
  7. # nmcli con show
  8. # 删除要更改 UUID 的网络连接:
  9. # nmcli con delete uuid <原 UUID>
  10. # 重新生成 UUID:
  11. # nmcli con add type ethernet ifname <接口名称> con-name <新名称>
  12. # 重新启用网络连接:
  13. # nmcli con up <新名称>
  14. # 更改网卡的UUID
  15. ssh root@192.168.1.31 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"
  16. ssh root@192.168.1.32 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"
  17. ssh root@192.168.1.33 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"
  18. ssh root@192.168.1.34 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"
  19. ssh root@192.168.1.35 "nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44;nmcli con add type ethernet ifname eth0 con-name eth0;nmcli con up eth0"
  20. # 参数解释
  21. #
  22. # ssh ssh root@192.168.1.31
  23. # 使用SSH登录到IP为192.168.1.31的主机,使用root用户身份。
  24. #
  25. # nmcli con delete uuid 708a1497-2192-43a5-9f03-2ab936fb3c44
  26. # 删除 UUID 为 708a1497-2192-43a5-9f03-2ab936fb3c44 的网络连接,这是 NetworkManager 中一种特定网络配置的唯一标识符。
  27. #
  28. # nmcli con add type ethernet ifname eth0 con-name eth0
  29. # 添加一种以太网连接类型,并指定接口名为 eth0,连接名称也为 eth0。
  30. #
  31. # nmcli con up eth0
  32. # 开启 eth0 这个网络连接。
  33. #
  34. # 简单来说,这个命令的作用是删除一个特定的网络连接配置,并添加一个名为 eth0 的以太网连接,然后启用这个新的连接。
  35. # 修改静态的IPv4地址
  36. ssh root@192.168.1.104 "nmcli con mod eth0 ipv4.addresses 192.168.1.31/24; nmcli con mod eth0 ipv4.gateway 192.168.1.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"
  37. ssh root@192.168.1.106 "nmcli con mod eth0 ipv4.addresses 192.168.1.32/24; nmcli con mod eth0 ipv4.gateway 192.168.1.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"
  38. ssh root@192.168.1.107 "nmcli con mod eth0 ipv4.addresses 192.168.1.33/24; nmcli con mod eth0 ipv4.gateway 192.168.1.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"
  39. ssh root@192.168.1.109 "nmcli con mod eth0 ipv4.addresses 192.168.1.34/24; nmcli con mod eth0 ipv4.gateway 192.168.1.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"
  40. ssh root@192.168.1.110 "nmcli con mod eth0 ipv4.addresses 192.168.1.35/24; nmcli con mod eth0 ipv4.gateway 192.168.1.1; nmcli con mod eth0 ipv4.method manual; nmcli con mod eth0 ipv4.dns "8.8.8.8"; nmcli con up eth0"
  41. # 参数解释
  42. #
  43. # ssh root@192.168.1.154
  44. # 使用SSH登录到IP为192.168.1.154的主机,使用root用户身份。
  45. #
  46. # "nmcli con mod eth0 ipv4.addresses 192.168.1.31/24"
  47. # 修改eth0网络连接的IPv4地址为192.168.1.31,子网掩码为 24。
  48. #
  49. # "nmcli con mod eth0 ipv4.gateway 192.168.1.1"
  50. # 修改eth0网络连接的IPv4网关为192.168.1.1。
  51. #
  52. # "nmcli con mod eth0 ipv4.method manual"
  53. # 将eth0网络连接的IPv4配置方法设置为手动。
  54. #
  55. # "nmcli con mod eth0 ipv4.dns "8.8.8.8"
  56. # 将eth0网络连接的IPv4 DNS服务器设置为 8.8.8.8。
  57. #
  58. # "nmcli con up eth0"
  59. # 启动eth0网络连接。
  60. #
  61. # 总体来说,这条命令是通过SSH远程登录到指定的主机,并使用网络管理命令 (nmcli) 修改eth0网络连接的配置,包括IP地址、网关、配置方法和DNS服务器,并启动该网络连接。
  62. # 没有IPv6选择不配置即可
  63. ssh root@192.168.1.31 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::10; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"
  64. ssh root@192.168.1.32 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::20; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"
  65. ssh root@192.168.1.33 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::30; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"
  66. ssh root@192.168.1.34 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::40; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"
  67. ssh root@192.168.1.35 "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::50; nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod eth0 ipv6.method manual; nmcli con mod eth0 ipv6.dns "2400:3200::1"; nmcli con up eth0"
  68. # 参数解释
  69. #
  70. # ssh root@192.168.1.31
  71. # 通过SSH连接到IP地址为192.168.1.31的远程主机,使用root用户进行登录。
  72. #
  73. # "nmcli con mod eth0 ipv6.addresses fc00:43f4:1eea:1::10"
  74. # 使用nmcli命令修改eth0接口的IPv6地址为fc00:43f4:1eea:1::10。
  75. #
  76. # "nmcli con mod eth0 ipv6.gateway fc00:43f4:1eea:1::1"
  77. # 使用nmcli命令修改eth0接口的IPv6网关为fc00:43f4:1eea:1::1。
  78. #
  79. # "nmcli con mod eth0 ipv6.method manual"
  80. # 使用nmcli命令将eth0接口的IPv6配置方法修改为手动配置。
  81. #
  82. # "nmcli con mod eth0 ipv6.dns "2400:3200::1"
  83. # 使用nmcli命令设置eth0接口的IPv6 DNS服务器为2400:3200::1。
  84. #
  85. # "nmcli con up eth0"
  86. # 使用nmcli命令启动eth0接口。
  87. #
  88. # 这个命令的目的是在远程主机上配置eth0接口的IPv6地址、网关、配置方法和DNS服务器,并启动eth0接口。
  89. # 查看网卡配置
  90. # nmcli device show eth0
  91. # nmcli con show eth0
  92. [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
  93. TYPE=Ethernet
  94. PROXY_METHOD=none
  95. BROWSER_ONLY=no
  96. BOOTPROTO=none
  97. DEFROUTE=yes
  98. IPV4_FAILURE_FATAL=no
  99. IPV6INIT=yes
  100. IPV6_AUTOCONF=yes
  101. IPV6_DEFROUTE=yes
  102. IPV6_FAILURE_FATAL=no
  103. IPV6_ADDR_GEN_MODE=stable-privacy
  104. NAME=eth0
  105. UUID=2aaddf95-3f36-4a48-8626-b55ebf7f53e7
  106. DEVICE=eth0
  107. ONBOOT=yes
  108. IPADDR=192.168.1.31
  109. PREFIX=24
  110. GATEWAY=192.168.1.1
  111. DNS1=8.8.8.8
  112. [root@localhost ~]#
  113. # 参数解释
  114. #
  115. # TYPE=Ethernet
  116. # 指定连接类型为以太网。
  117. #
  118. # PROXY_METHOD=none
  119. # 指定不使用代理方法。
  120. #
  121. # BROWSER_ONLY=no
  122. # 指定不仅仅在浏览器中使用代理。
  123. #
  124. # BOOTPROTO=none
  125. # 指定自动分配地址的方式为无(即手动配置IP地址)。
  126. #
  127. # DEFROUTE=yes
  128. # 指定默认路由开启。
  129. #
  130. # IPV4_FAILURE_FATAL=no
  131. # 指定IPv4连接失败时不宣告严重错误。
  132. #
  133. # IPV6INIT=yes
  134. # 指定启用IPv6。
  135. #
  136. # IPV6_AUTOCONF=no
  137. # 指定不自动配置IPv6地址。
  138. #
  139. # IPV6_DEFROUTE=yes
  140. # 指定默认IPv6路由开启。
  141. #
  142. # IPV6_FAILURE_FATAL=no
  143. # 指定IPv6连接失败时不宣告严重错误。
  144. #
  145. # IPV6_ADDR_GEN_MODE=stable-privacy
  146. # 指定IPv6地址生成模式为稳定隐私模式。
  147. #
  148. # NAME=eth0
  149. # 指定设备名称为eth0。
  150. #
  151. # UUID=424fd260-c480-4899-97e6-6fc9722031e8
  152. # 指定设备的唯一标识符。
  153. #
  154. # DEVICE=eth0
  155. # 指定设备名称为eth0。
  156. #
  157. # ONBOOT=yes
  158. # 指定开机自动启用这个连接。
  159. #
  160. # IPADDR=192.168.1.31
  161. # 指定IPv4地址为192.168.1.31。
  162. #
  163. # PREFIX=24
  164. # 指定IPv4地址的子网掩码为24。
  165. #
  166. # GATEWAY=192.168.8.1
  167. # 指定IPv4的网关地址为192.168.8.1。
  168. #
  169. # DNS1=8.8.8.8
  170. # 指定首选DNS服务器为8.8.8.8。
  171. #
  172. # IPV6ADDR=fc00:43f4:1eea:1::10/128
  173. # 指定IPv6地址为fc00:43f4:1eea:1::10,子网掩码为128。
  174. #
  175. # IPV6_DEFAULTGW=fc00:43f4:1eea:1::1
  176. # 指定IPv6的默认网关地址为fc00:43f4:1eea:1::1。
  177. #
  178. # DNS2=2400:3200::1
  179. # 指定备用DNS服务器为2400:3200::1。

1.3.设置主机名

  1. hostnamectl set-hostname k8s-master01
  2. hostnamectl set-hostname k8s-master02
  3. hostnamectl set-hostname k8s-master03
  4. hostnamectl set-hostname k8s-node01
  5. hostnamectl set-hostname k8s-node02
  6. # 参数解释
  7. #
  8. # 参数: set-hostname
  9. # 解释: 这是hostnamectl命令的一个参数,用于设置系统的主机名。
  10. #
  11. # 参数: k8s-master01
  12. # 解释: 这是要设置的主机名,将系统的主机名设置为"k8s-master01"。

1.4.配置yum源

  1. # 其他系统的源地址
  2. # https://mirrors.tuna.tsinghua.edu.cn/help/
  3. # 对于 Ubuntu
  4. sed -i 's/cn.archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
  5. # 对于 CentOS 7
  6. sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' -i.bak /etc/yum.repos.d/CentOS-*.repo
  7. # 对于 CentOS 8
  8. sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos|g' -i.bak /etc/yum.repos.d/CentOS-*.repo
  9. # 对于私有仓库
  10. sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/\$contentdir|baseurl=http://192.168.1.123/centos|g' -i.bak /etc/yum.repos.d/CentOS-*.repo
  11. # 参数解释
  12. #
  13. # 以上命令是用于更改系统软件源的配置,以便从国内镜像站点下载软件包和更新。
  14. #
  15. # 对于 Ubuntu 系统,将 /etc/apt/sources.list 文件中的软件源地址 cn.archive.ubuntu.com 替换为 mirrors.ustc.edu.cn。
  16. #
  17. # 对于 CentOS 7 系统,将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉,并将 baseurl 的值替换为 https://mirrors.tuna.tsinghua.edu.cn/centos。
  18. #
  19. # 对于 CentOS 8 系统,同样将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉,并将 baseurl 的值替换为 https://mirrors.tuna.tsinghua.edu.cn/centos。
  20. #
  21. # 对于私有仓库,将 /etc/yum.repos.d/CentOS-*.repo 文件中的 mirrorlist 注释掉,并将 baseurl 的值替换为私有仓库地址 http://192.168.1.123/centos。
  22. #
  23. # 这些命令通过使用 sed 工具和正则表达式,对相应的配置文件进行批量的替换操作,从而更改系统软件源配置。

1.5.安装一些必备工具

  1. # 对于 Ubuntu
  2. apt update && apt upgrade -y && apt install -y wget psmisc vim net-tools nfs-kernel-server telnet lvm2 git tar curl
  3. # 对于 CentOS 7
  4. yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl
  5. # 对于 CentOS 8
  6. yum update -y && yum -y install wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl

1.5.1 下载离线所需文件(可选)

在互联网服务器上安装一个一模一样的系统进行下载所需包

CentOS7
  1. # 下载必要工具
  2. yum -y install createrepo yum-utils wget epel*
  3. # 下载全量依赖包
  4. repotrack createrepo wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp
  5. # 删除libseccomp
  6. rm -rf libseccomp-*.rpm
  7. # 下载libseccomp
  8. wget http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
  9. # 创建yum源信息
  10. createrepo -u -d /data/centos7/
  11. # 拷贝包到内网机器上
  12. scp -r /data/centos7/ root@192.168.1.31:
  13. scp -r /data/centos7/ root@192.168.1.32:
  14. scp -r /data/centos7/ root@192.168.1.33:
  15. scp -r /data/centos7/ root@192.168.1.34:
  16. scp -r /data/centos7/ root@192.168.1.35:
  17. # 在内网机器上创建repo配置文件
  18. rm -rf /etc/yum.repos.d/*
  19. cat > /etc/yum.repos.d/123.repo << EOF
  20. [cby]
  21. name=CentOS-$releasever - Media
  22. baseurl=file:///root/centos7/
  23. gpgcheck=0
  24. enabled=1
  25. EOF
  26. # 安装下载好的包
  27. yum clean all
  28. yum makecache
  29. yum install /root/centos7/* --skip-broken -y
  30. #### 备注 #####
  31. # 安装完成后,可能还会出现yum无法使用那么再次执行
  32. rm -rf /etc/yum.repos.d/*
  33. cat > /etc/yum.repos.d/123.repo << EOF
  34. [cby]
  35. name=CentOS-$releasever - Media
  36. baseurl=file:///root/centos7/
  37. gpgcheck=0
  38. enabled=1
  39. EOF
  40. yum clean all
  41. yum makecache
  42. yum install /root/centos7/* --skip-broken -y
  43. #### 备注 #####
  44. # 安装 chrony 和 libseccomp
  45. # yum install /root/centos7/libseccomp-2.5.1*.rpm -y
  46. # yum install /root/centos7/chrony-*.rpm -y
CentOS8
  1. # 下载必要工具
  2. yum -y install createrepo yum-utils wget epel*
  3. # 下载全量依赖包
  4. repotrack wget psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp
  5. # 创建yum源信息
  6. createrepo -u -d /data/centos8/
  7. # 拷贝包到内网机器上
  8. scp -r centos8/ root@192.168.1.31:
  9. scp -r centos8/ root@192.168.1.32:
  10. scp -r centos8/ root@192.168.1.33:
  11. scp -r centos8/ root@192.168.1.34:
  12. scp -r centos8/ root@192.168.1.35:
  13. # 在内网机器上创建repo配置文件
  14. rm -rf /etc/yum.repos.d/*
  15. cat > /etc/yum.repos.d/123.repo << EOF
  16. [cby]
  17. name=CentOS-$releasever - Media
  18. baseurl=file:///root/centos8/
  19. gpgcheck=0
  20. enabled=1
  21. EOF
  22. # 安装下载好的包
  23. yum clean all
  24. yum makecache
  25. yum install /root/centos8/* --skip-broken -y
  26. #### 备注 #####
  27. # 安装完成后,可能还会出现yum无法使用那么再次执行
  28. rm -rf /etc/yum.repos.d/*
  29. cat > /etc/yum.repos.d/123.repo << EOF
  30. [cby]
  31. name=CentOS-$releasever - Media
  32. baseurl=file:///root/centos8/
  33. gpgcheck=0
  34. enabled=1
  35. EOF
  36. yum clean all
  37. yum makecache
  38. yum install /root/centos8/* --skip-broken -y
Ubuntu 下载包和依赖
  1. #!/bin/bash
  2. logfile=123.log
  3. ret=""
  4. function getDepends()
  5. {
  6. echo "fileName is" $1>>$logfile
  7. # use tr to del < >
  8. ret=`apt-cache depends $1|grep Depends |cut -d: -f2 |tr -d "<>"`
  9. echo $ret|tee -a $logfile
  10. }
  11. # 需要获取其所依赖包的包
  12. libs="wget psmisc vim net-tools nfs-kernel-server telnet lvm2 git tar curl gcc keepalived haproxy bash-completion chrony sshpass ipvsadm ipset sysstat conntrack libseccomp"
  13. # download libs dependen. deep in 3
  14. i=0
  15. while [ $i -lt 3 ] ;
  16. do
  17. let i++
  18. echo $i
  19. # download libs
  20. newlist=" "
  21. for j in $libs
  22. do
  23. added="$(getDepends $j)"
  24. newlist="$newlist $added"
  25. apt install $added --reinstall -d -y
  26. done
  27. libs=$newlist
  28. done
  29. # 创建源信息
  30. apt install dpkg-dev
  31. sudo cp /var/cache/apt/archives/*.deb /data/ubuntu/ -r
  32. dpkg-scanpackages . /dev/null |gzip > /data/ubuntu/Packages.gz -r
  33. # 拷贝包到内网机器上
  34. scp -r ubuntu/ root@192.168.1.31:
  35. scp -r ubuntu/ root@192.168.1.32:
  36. scp -r ubuntu/ root@192.168.1.33:
  37. scp -r ubuntu/ root@192.168.1.34:
  38. scp -r ubuntu/ root@192.168.1.35:
  39. # 在内网机器上配置apt源
  40. vim /etc/apt/sources.list
  41. cat /etc/apt/sources.list
  42. deb file:////root/ ubuntu/
  43. # 安装deb包
  44. apt install ./*.deb

1.6.选择性下载需要工具

  1. #!/bin/bash
  2. # 查看版本地址:
  3. #
  4. # https://github.com/containernetworking/plugins/releases/
  5. # https://github.com/containerd/containerd/releases/
  6. # https://github.com/kubernetes-sigs/cri-tools/releases/
  7. # https://github.com/Mirantis/cri-dockerd/releases/
  8. # https://github.com/etcd-io/etcd/releases/
  9. # https://github.com/cloudflare/cfssl/releases/
  10. # https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
  11. # https://download.docker.com/linux/static/stable/x86_64/
  12. # https://github.com/opencontainers/runc/releases/
  13. # https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/
  14. # https://github.com/helm/helm/tags
  15. # http://nginx.org/download/
  16. # Version numbers
  17. cni_plugins_version='v1.4.0'
  18. cri_containerd_cni_version='1.7.13'
  19. crictl_version='v1.29.0'
  20. cri_dockerd_version='0.3.10'
  21. etcd_version='v3.5.12'
  22. cfssl_version='1.6.4'
  23. kubernetes_server_version='1.29.2'
  24. docker_version='25.0.3'
  25. runc_version='1.1.12'
  26. kernel_version='5.4.268'
  27. helm_version='3.14.1'
  28. nginx_version='1.25.4'
  29. # URLs
  30. base_url='https://mirrors.chenby.cn/https://github.com'
  31. kernel_url="http://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/kernel-lt-${kernel_version}-1.el7.elrepo.x86_64.rpm"
  32. runc_url="${base_url}/opencontainers/runc/releases/download/v${runc_version}/runc.amd64"
  33. docker_url="https://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-${docker_version}.tgz"
  34. cni_plugins_url="${base_url}/containernetworking/plugins/releases/download/${cni_plugins_version}/cni-plugins-linux-amd64-${cni_plugins_version}.tgz"
  35. cri_containerd_cni_url="${base_url}/containerd/containerd/releases/download/v${cri_containerd_cni_version}/cri-containerd-cni-${cri_containerd_cni_version}-linux-amd64.tar.gz"
  36. crictl_url="${base_url}/kubernetes-sigs/cri-tools/releases/download/${crictl_version}/crictl-${crictl_version}-linux-amd64.tar.gz"
  37. cri_dockerd_url="${base_url}/Mirantis/cri-dockerd/releases/download/v${cri_dockerd_version}/cri-dockerd-${cri_dockerd_version}.amd64.tgz"
  38. etcd_url="${base_url}/etcd-io/etcd/releases/download/${etcd_version}/etcd-${etcd_version}-linux-amd64.tar.gz"
  39. cfssl_url="${base_url}/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssl_${cfssl_version}_linux_amd64"
  40. cfssljson_url="${base_url}/cloudflare/cfssl/releases/download/v${cfssl_version}/cfssljson_${cfssl_version}_linux_amd64"
  41. helm_url="https://mirrors.huaweicloud.com/helm/v${helm_version}/helm-v${helm_version}-linux-amd64.tar.gz"
  42. kubernetes_server_url="https://storage.googleapis.com/kubernetes-release/release/v${kubernetes_server_version}/kubernetes-server-linux-amd64.tar.gz"
  43. nginx_url="http://nginx.org/download/nginx-${nginx_version}.tar.gz"
  44. # Download packages
  45. packages=(
  46. $kernel_url
  47. $runc_url
  48. $docker_url
  49. $cni_plugins_url
  50. $cri_containerd_cni_url
  51. $crictl_url
  52. $cri_dockerd_url
  53. $etcd_url
  54. $cfssl_url
  55. $cfssljson_url
  56. $helm_url
  57. $kubernetes_server_url
  58. $nginx_url
  59. )
  60. for package_url in "${packages[@]}"; do
  61. filename=$(basename "$package_url")
  62. if curl --parallel --parallel-immediate -k -L -C - -o "$filename" "$package_url"; then
  63. echo "Downloaded $filename"
  64. else
  65. echo "Failed to download $filename"
  66. exit 1
  67. fi
  68. done

1.7.关闭防火墙

  1. # Ubuntu忽略,CentOS执行
  2. systemctl disable --now firewalld

1.8.关闭SELinux

  1. # Ubuntu忽略,CentOS执行
  2. setenforce 0
  3. sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  4. # 参数解释
  5. #
  6. # setenforce 0
  7. # 此命令用于设置 SELinux 的执行模式。0 表示关闭 SELinux。
  8. #
  9. # sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  10. # 该命令使用 sed 工具来编辑 /etc/selinux/config 文件。其中 '-i' 参数表示直接修改原文件,而不是输出到终端或另一个文件。's#SELINUX=enforcing#SELINUX=disabled#g' 是 sed 的替换命令,它将文件中所有的 "SELINUX=enforcing" 替换为 "SELINUX=disabled"。这里的 '#' 是分隔符,用于替代传统的 '/' 分隔符,以避免与路径中的 '/' 冲突。

1.9.关闭交换分区

  1. sed -ri 's/.*swap.*/#&/' /etc/fstab
  2. swapoff -a && sysctl -w vm.swappiness=0
  3. cat /etc/fstab
  4. # /dev/mapper/centos-swap swap swap defaults 0 0
  5. # 参数解释:
  6. #
  7. # -ri: 这个参数用于在原文件中替换匹配的模式。-r表示扩展正则表达式,-i允许直接修改文件。
  8. # 's/.*swap.*/#&/': 这是一个sed命令,用于在文件/etc/fstab中找到包含swap的行,并在行首添加#来注释掉该行。
  9. # /etc/fstab: 这是一个文件路径,即/etc/fstab文件,用于存储文件系统表。
  10. # swapoff -a: 这个命令用于关闭所有启用的交换分区。
  11. # sysctl -w vm.swappiness=0: 这个命令用于修改vm.swappiness参数的值为0,表示系统在物理内存充足时更倾向于使用物理内存而非交换分区。

1.10.网络配置(俩种方式二选一)

  1. # Ubuntu忽略,CentOS执行
  2. # 方式一
  3. # systemctl disable --now NetworkManager
  4. # systemctl start network && systemctl enable network
  5. # 方式二
  6. cat > /etc/NetworkManager/conf.d/calico.conf << EOF
  7. [keyfile]
  8. unmanaged-devices=interface-name:cali*;interface-name:tunl*
  9. EOF
  10. systemctl restart NetworkManager
  11. # 参数解释
  12. #
  13. # 这个参数用于指定不由 NetworkManager 管理的设备。它由以下两个部分组成
  14. #
  15. # interface-name:cali*
  16. # 表示以 "cali" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"cali0", "cali1" 等接口不受 NetworkManager 管理。
  17. #
  18. # interface-name:tunl*
  19. # 表示以 "tunl" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"tunl0", "tunl1" 等接口不受 NetworkManager 管理。
  20. #
  21. # 通过使用这个参数,可以将特定的接口排除在 NetworkManager 的管理范围之外,以便其他工具或进程可以独立地管理和配置这些接口。

1.11.进行时间同步

  1. # 服务端
  2. # apt install chrony -y
  3. yum install chrony -y
  4. cat > /etc/chrony.conf << EOF
  5. pool ntp.aliyun.com iburst
  6. driftfile /var/lib/chrony/drift
  7. makestep 1.0 3
  8. rtcsync
  9. allow 192.168.1.0/24
  10. local stratum 10
  11. keyfile /etc/chrony.keys
  12. leapsectz right/UTC
  13. logdir /var/log/chrony
  14. EOF
  15. systemctl restart chronyd ; systemctl enable chronyd
  16. # 客户端
  17. # apt install chrony -y
  18. yum install chrony -y
  19. cat > /etc/chrony.conf << EOF
  20. pool 192.168.1.31 iburst
  21. driftfile /var/lib/chrony/drift
  22. makestep 1.0 3
  23. rtcsync
  24. keyfile /etc/chrony.keys
  25. leapsectz right/UTC
  26. logdir /var/log/chrony
  27. EOF
  28. systemctl restart chronyd ; systemctl enable chronyd
  29. #使用客户端进行验证
  30. chronyc sources -v
  31. # 参数解释
  32. #
  33. # pool ntp.aliyun.com iburst
  34. # 指定使用ntp.aliyun.com作为时间服务器池,iburst选项表示在初始同步时会发送多个请求以加快同步速度。
  35. #
  36. # driftfile /var/lib/chrony/drift
  37. # 指定用于保存时钟漂移信息的文件路径。
  38. #
  39. # makestep 1.0 3
  40. # 设置当系统时间与服务器时间偏差大于1秒时,会以1秒的步长进行调整。如果偏差超过3秒,则立即进行时间调整。
  41. #
  42. # rtcsync
  43. # 启用硬件时钟同步功能,可以提高时钟的准确性。
  44. #
  45. # allow 192.168.0.0/24
  46. # 允许192.168.0.0/24网段范围内的主机与chrony进行时间同步。
  47. #
  48. # local stratum 10
  49. # 将本地时钟设为stratum 10,stratum值表示时钟的准确度,值越小表示准确度越高。
  50. #
  51. # keyfile /etc/chrony.keys
  52. # 指定使用的密钥文件路径,用于对时间同步进行身份验证。
  53. #
  54. # leapsectz right/UTC
  55. # 指定时区为UTC。
  56. #
  57. # logdir /var/log/chrony
  58. # 指定日志文件存放目录。

1.12.配置ulimit

  1. ulimit -SHn 65535
  2. cat >> /etc/security/limits.conf <<EOF
  3. * soft nofile 655360
  4. * hard nofile 131072
  5. * soft nproc 655350
  6. * hard nproc 655350
  7. * seft memlock unlimited
  8. * hard memlock unlimitedd
  9. EOF
  10. # 参数解释
  11. #
  12. # soft nofile 655360
  13. # soft表示软限制,nofile表示一个进程可打开的最大文件数,默认值为1024。这里的软限制设置为655360,即一个进程可打开的最大文件数为655360。
  14. #
  15. # hard nofile 131072
  16. # hard表示硬限制,即系统设置的最大值。nofile表示一个进程可打开的最大文件数,默认值为4096。这里的硬限制设置为131072,即系统设置的最大文件数为131072。
  17. #
  18. # soft nproc 655350
  19. # soft表示软限制,nproc表示一个用户可创建的最大进程数,默认值为30720。这里的软限制设置为655350,即一个用户可创建的最大进程数为655350。
  20. #
  21. # hard nproc 655350
  22. # hard表示硬限制,即系统设置的最大值。nproc表示一个用户可创建的最大进程数,默认值为4096。这里的硬限制设置为655350,即系统设置的最大进程数为655350。
  23. #
  24. # seft memlock unlimited
  25. # seft表示软限制,memlock表示一个进程可锁定在RAM中的最大内存,默认值为64 KB。这里的软限制设置为unlimited,即一个进程可锁定的最大内存为无限制。
  26. #
  27. # hard memlock unlimited
  28. # hard表示硬限制,即系统设置的最大值。memlock表示一个进程可锁定在RAM中的最大内存,默认值为64 KB。这里的硬限制设置为unlimited,即系统设置的最大内存锁定为无限制。

1.13.配置免密登录

  1. # apt install -y sshpass
  2. yum install -y sshpass
  3. ssh-keygen -f /root/.ssh/id_rsa -P ''
  4. export IP="192.168.1.31 192.168.1.32 192.168.1.33 192.168.1.34 192.168.1.35"
  5. export SSHPASS=123123
  6. for HOST in $IP;do
  7. sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST
  8. done
  9. # 这段脚本的作用是在一台机器上安装sshpass工具,并通过sshpass自动将本机的SSH公钥复制到多个远程主机上,以实现无需手动输入密码的SSH登录。
  10. #
  11. # 具体解释如下:
  12. #
  13. # 1. `apt install -y sshpass` 或 `yum install -y sshpass`:通过包管理器(apt或yum)安装sshpass工具,使得后续可以使用sshpass命令。
  14. #
  15. # 2. `ssh-keygen -f /root/.ssh/id_rsa -P ''`:生成SSH密钥对。该命令会在/root/.ssh目录下生成私钥文件id_rsa和公钥文件id_rsa.pub,同时不设置密码(即-P参数后面为空),方便后续通过ssh-copy-id命令自动复制公钥。
  16. #
  17. # 3. `export IP="192.168.1.31 192.168.1.32 192.168.1.33 192.168.1.34 192.168.1.35"`:设置一个包含多个远程主机IP地址的环境变量IP,用空格分隔开,表示要将SSH公钥复制到这些远程主机上。
  18. #
  19. # 4. `export SSHPASS=123123`:设置环境变量SSHPASS,将sshpass所需的SSH密码(在这里是"123123")赋值给它,这样sshpass命令可以自动使用这个密码进行登录。
  20. #
  21. # 5. `for HOST in $IP;do`:遍历环境变量IP中的每个IP地址,并将当前IP地址赋值给变量HOST。
  22. #
  23. # 6. `sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST`:使用sshpass工具复制本机的SSH公钥到远程主机。其中,-e选项表示使用环境变量中的密码(即SSHPASS)进行登录,-o StrictHostKeyChecking=no选项表示连接时不检查远程主机的公钥,以避免交互式确认。
  24. #
  25. # 通过这段脚本,可以方便地将本机的SSH公钥复制到多个远程主机上,实现无需手动输入密码的SSH登录。

1.14.添加启用源

  1. # Ubuntu忽略,CentOS执行
  2. # 为 RHEL-8或 CentOS-8配置源
  3. yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y
  4. sed -i "s@mirrorlist@#mirrorlist@g" /etc/yum.repos.d/elrepo.repo
  5. sed -i "s@elrepo.org/linux@mirrors.tuna.tsinghua.edu.cn/elrepo@g" /etc/yum.repos.d/elrepo.repo
  6. # 为 RHEL-7 SL-7 或 CentOS-7 安装 ELRepo
  7. yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y
  8. sed -i "s@mirrorlist@#mirrorlist@g" /etc/yum.repos.d/elrepo.repo
  9. sed -i "s@elrepo.org/linux@mirrors.tuna.tsinghua.edu.cn/elrepo@g" /etc/yum.repos.d/elrepo.repo
  10. # 查看可用安装包
  11. yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

1.15.升级内核至4.18版本以上

  1. # Ubuntu忽略,CentOS执行
  2. # 安装最新的内核
  3. # 我这里选择的是稳定版kernel-ml 如需更新长期维护版本kernel-lt
  4. yum -y --enablerepo=elrepo-kernel install kernel-ml
  5. # 查看已安装那些内核
  6. rpm -qa | grep kernel
  7. # 查看默认内核
  8. grubby --default-kernel
  9. # 若不是最新的使用命令设置
  10. grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo)
  11. # 重启生效
  12. reboot
  13. # v8 整合命令为:
  14. yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm -y ; sed -i "s@mirrorlist@#mirrorlist@g" /etc/yum.repos.d/elrepo.repo ; sed -i "s@elrepo.org/linux@mirrors.tuna.tsinghua.edu.cn/elrepo@g" /etc/yum.repos.d/elrepo.repo ; yum --disablerepo="*" --enablerepo="elrepo-kernel" list available -y ; yum --enablerepo=elrepo-kernel install kernel-lt -y ; grubby --default-kernel ; reboot
  15. # v7 整合命令为:
  16. yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm -y ; sed -i "s@mirrorlist@#mirrorlist@g" /etc/yum.repos.d/elrepo.repo ; sed -i "s@elrepo.org/linux@mirrors.tuna.tsinghua.edu.cn/elrepo@g" /etc/yum.repos.d/elrepo.repo ; yum --disablerepo="*" --enablerepo="elrepo-kernel" list available -y ; yum --enablerepo=elrepo-kernel install kernel-lt -y ; grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo) ; grubby --default-kernel ; reboot
  17. # 离线版本
  18. yum install -y /root/cby/kernel-lt-*-1.el7.elrepo.x86_64.rpm ; grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo) ; grubby --default-kernel ; reboot

1.16.安装ipvsadm

  1. # 对于CentOS7离线安装
  2. # yum install /root/centos7/ipset-*.el7.x86_64.rpm /root/centos7/lm_sensors-libs-*.el7.x86_64.rpm /root/centos7/ipset-libs-*.el7.x86_64.rpm /root/centos7/sysstat-*.el7_9.x86_64.rpm /root/centos7/ipvsadm-*.el7.x86_64.rpm -y
  3. # 对于 Ubuntu
  4. # apt install ipvsadm ipset sysstat conntrack -y
  5. # 对于 CentOS
  6. yum install ipvsadm ipset sysstat conntrack libseccomp -y
  7. cat >> /etc/modules-load.d/ipvs.conf <<EOF
  8. ip_vs
  9. ip_vs_rr
  10. ip_vs_wrr
  11. ip_vs_sh
  12. nf_conntrack
  13. ip_tables
  14. ip_set
  15. xt_set
  16. ipt_set
  17. ipt_rpfilter
  18. ipt_REJECT
  19. ipip
  20. EOF
  21. systemctl restart systemd-modules-load.service
  22. lsmod | grep -e ip_vs -e nf_conntrack
  23. ip_vs_sh 16384 0
  24. ip_vs_wrr 16384 0
  25. ip_vs_rr 16384 0
  26. ip_vs 180224 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
  27. nf_conntrack 176128 1 ip_vs
  28. nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
  29. nf_defrag_ipv4 16384 1 nf_conntrack
  30. libcrc32c 16384 3 nf_conntrack,xfs,ip_vs
  31. # 参数解释
  32. #
  33. # ip_vs
  34. # IPVS 是 Linux 内核中的一个模块,用于实现负载均衡和高可用性。它通过在前端代理服务器上分发传入请求到后端实际服务器上,提供了高性能和可扩展的网络服务。
  35. #
  36. # ip_vs_rr
  37. # IPVS 的一种调度算法之一,使用轮询方式分发请求到后端服务器,每个请求按顺序依次分发。
  38. #
  39. # ip_vs_wrr
  40. # IPVS 的一种调度算法之一,使用加权轮询方式分发请求到后端服务器,每个请求按照指定的权重比例分发。
  41. #
  42. # ip_vs_sh
  43. # IPVS 的一种调度算法之一,使用哈希方式根据源 IP 地址和目标 IP 地址来分发请求。
  44. #
  45. # nf_conntrack
  46. # 这是一个内核模块,用于跟踪和管理网络连接,包括 TCP、UDP 和 ICMP 等协议。它是实现防火墙状态跟踪的基础。
  47. #
  48. # ip_tables
  49. # 这是一个内核模块,提供了对 Linux 系统 IP 数据包过滤和网络地址转换(NAT)功能的支持。
  50. #
  51. # ip_set
  52. # 这是一个内核模块,扩展了 iptables 的功能,支持更高效的 IP 地址集合操作。
  53. #
  54. # xt_set
  55. # 这是一个内核模块,扩展了 iptables 的功能,支持更高效的数据包匹配和操作。
  56. #
  57. # ipt_set
  58. # 这是一个用户空间工具,用于配置和管理 xt_set 内核模块。
  59. #
  60. # ipt_rpfilter
  61. # 这是一个内核模块,用于实现反向路径过滤,用于防止 IP 欺骗和 DDoS 攻击。
  62. #
  63. # ipt_REJECT
  64. # 这是一个 iptables 目标,用于拒绝 IP 数据包,并向发送方发送响应,指示数据包被拒绝。
  65. #
  66. # ipip
  67. # 这是一个内核模块,用于实现 IP 封装在 IP(IP-over-IP)的隧道功能。它可以在不同网络之间创建虚拟隧道来传输 IP 数据包。

1.17.修改内核参数

  1. cat <<EOF > /etc/sysctl.d/k8s.conf
  2. net.ipv4.ip_forward = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. fs.may_detach_mounts = 1
  5. vm.overcommit_memory=1
  6. vm.panic_on_oom=0
  7. fs.inotify.max_user_watches=89100
  8. fs.file-max=52706963
  9. fs.nr_open=52706963
  10. net.netfilter.nf_conntrack_max=2310720
  11. net.ipv4.tcp_keepalive_time = 600
  12. net.ipv4.tcp_keepalive_probes = 3
  13. net.ipv4.tcp_keepalive_intvl =15
  14. net.ipv4.tcp_max_tw_buckets = 36000
  15. net.ipv4.tcp_tw_reuse = 1
  16. net.ipv4.tcp_max_orphans = 327680
  17. net.ipv4.tcp_orphan_retries = 3
  18. net.ipv4.tcp_syncookies = 1
  19. net.ipv4.tcp_max_syn_backlog = 16384
  20. net.ipv4.ip_conntrack_max = 65536
  21. net.ipv4.tcp_max_syn_backlog = 16384
  22. net.ipv4.tcp_timestamps = 0
  23. net.core.somaxconn = 16384
  24. net.ipv6.conf.all.disable_ipv6 = 0
  25. net.ipv6.conf.default.disable_ipv6 = 0
  26. net.ipv6.conf.lo.disable_ipv6 = 0
  27. net.ipv6.conf.all.forwarding = 1
  28. EOF
  29. sysctl --system
  30. # 这些是Linux系统的一些参数设置,用于配置和优化网络、文件系统和虚拟内存等方面的功能。以下是每个参数的详细解释:
  31. #
  32. # 1. net.ipv4.ip_forward = 1
  33. # - 这个参数启用了IPv4的IP转发功能,允许服务器作为网络路由器转发数据包。
  34. #
  35. # 2. net.bridge.bridge-nf-call-iptables = 1
  36. # - 当使用网络桥接技术时,将数据包传递到iptables进行处理。
  37. #
  38. # 3. fs.may_detach_mounts = 1
  39. # - 允许在挂载文件系统时,允许被其他进程使用。
  40. #
  41. # 4. vm.overcommit_memory=1
  42. # - 该设置允许原始的内存过量分配策略,当系统的内存已经被完全使用时,系统仍然会分配额外的内存。
  43. #
  44. # 5. vm.panic_on_oom=0
  45. # - 当系统内存不足(OOM)时,禁用系统崩溃和重启。
  46. #
  47. # 6. fs.inotify.max_user_watches=89100
  48. # - 设置系统允许一个用户的inotify实例可以监控的文件数目的上限。
  49. #
  50. # 7. fs.file-max=52706963
  51. # - 设置系统同时打开的文件数的上限。
  52. #
  53. # 8. fs.nr_open=52706963
  54. # - 设置系统同时打开的文件描述符数的上限。
  55. #
  56. # 9. net.netfilter.nf_conntrack_max=2310720
  57. # - 设置系统可以创建的网络连接跟踪表项的最大数量。
  58. #
  59. # 10. net.ipv4.tcp_keepalive_time = 600
  60. # - 设置TCP套接字的空闲超时时间(秒),超过该时间没有活动数据时,内核会发送心跳包。
  61. #
  62. # 11. net.ipv4.tcp_keepalive_probes = 3
  63. # - 设置未收到响应的TCP心跳探测次数。
  64. #
  65. # 12. net.ipv4.tcp_keepalive_intvl = 15
  66. # - 设置TCP心跳探测的时间间隔(秒)。
  67. #
  68. # 13. net.ipv4.tcp_max_tw_buckets = 36000
  69. # - 设置系统可以使用的TIME_WAIT套接字的最大数量。
  70. #
  71. # 14. net.ipv4.tcp_tw_reuse = 1
  72. # - 启用TIME_WAIT套接字的重新利用,允许新的套接字使用旧的TIME_WAIT套接字。
  73. #
  74. # 15. net.ipv4.tcp_max_orphans = 327680
  75. # - 设置系统可以同时存在的TCP套接字垃圾回收包裹数的最大数量。
  76. #
  77. # 16. net.ipv4.tcp_orphan_retries = 3
  78. # - 设置系统对于孤立的TCP套接字的重试次数。
  79. #
  80. # 17. net.ipv4.tcp_syncookies = 1
  81. # - 启用TCP SYN cookies保护,用于防止SYN洪泛攻击。
  82. #
  83. # 18. net.ipv4.tcp_max_syn_backlog = 16384
  84. # - 设置新的TCP连接的半连接数(半连接队列)的最大长度。
  85. #
  86. # 19. net.ipv4.ip_conntrack_max = 65536
  87. # - 设置系统可以创建的网络连接跟踪表项的最大数量。
  88. #
  89. # 20. net.ipv4.tcp_timestamps = 0
  90. # - 关闭TCP时间戳功能,用于提供更好的安全性。
  91. #
  92. # 21. net.core.somaxconn = 16384
  93. # - 设置系统核心层的连接队列的最大值。
  94. #
  95. # 22. net.ipv6.conf.all.disable_ipv6 = 0
  96. # - 启用IPv6协议。
  97. #
  98. # 23. net.ipv6.conf.default.disable_ipv6 = 0
  99. # - 启用IPv6协议。
  100. #
  101. # 24. net.ipv6.conf.lo.disable_ipv6 = 0
  102. # - 启用IPv6协议。
  103. #
  104. # 25. net.ipv6.conf.all.forwarding = 1
  105. # - 允许IPv6数据包转发。

1.18.所有节点配置hosts本地解析

  1. cat > /etc/hosts <<EOF
  2. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  3. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  4. 192.168.1.31 k8s-master01
  5. 192.168.1.32 k8s-master02
  6. 192.168.1.33 k8s-master03
  7. 192.168.1.34 k8s-node01
  8. 192.168.1.35 k8s-node02
  9. 192.168.1.36 lb-vip
  10. EOF

2.k8s基本组件安装

注意 : 2.1 和 2.2 二选其一即可

2.1.安装Containerd作为Runtime (推荐)

  1. # https://github.com/containernetworking/plugins/releases/
  2. # wget https://mirrors.chenby.cn/https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz
  3. cd cby/
  4. #创建cni插件所需目录
  5. mkdir -p /etc/cni/net.d /opt/cni/bin
  6. #解压cni二进制包
  7. tar xf cni-plugins-linux-amd64-v*.tgz -C /opt/cni/bin/
  8. # https://github.com/containerd/containerd/releases/
  9. # wget https://mirrors.chenby.cn/https://github.com/containerd/containerd/releases/download/v1.7.13/cri-containerd-cni-1.7.13-linux-amd64.tar.gz
  10. #解压
  11. tar -xzf cri-containerd-cni-*-linux-amd64.tar.gz -C /
  12. #创建服务启动文件
  13. cat > /etc/systemd/system/containerd.service <<EOF
  14. [Unit]
  15. Description=containerd container runtime
  16. Documentation=https://containerd.io
  17. After=network.target local-fs.target
  18. [Service]
  19. ExecStartPre=-/sbin/modprobe overlay
  20. ExecStart=/usr/local/bin/containerd
  21. Type=notify
  22. Delegate=yes
  23. KillMode=process
  24. Restart=always
  25. RestartSec=5
  26. LimitNPROC=infinity
  27. LimitCORE=infinity
  28. LimitNOFILE=infinity
  29. TasksMax=infinity
  30. OOMScoreAdjust=-999
  31. [Install]
  32. WantedBy=multi-user.target
  33. EOF
  34. # 参数解释:
  35. #
  36. # 这是一个用于启动containerd容器运行时的systemd unit文件。下面是对该文件不同部分的详细解释:
  37. #
  38. # [Unit]
  39. # Description=containerd container runtime
  40. # 描述该unit的作用是作为containerd容器运行时。
  41. #
  42. # Documentation=https://containerd.io
  43. # 指向容器运行时的文档的URL。
  44. #
  45. # After=network.target local-fs.target
  46. # 定义了在哪些依赖项之后该unit应该被启动。在网络和本地文件系统加载完成后启动,确保了容器运行时在这些依赖项可用时才会启动。
  47. #
  48. # [Service]
  49. # ExecStartPre=-/sbin/modprobe overlay
  50. # 在启动containerd之前执行的命令。这里的命令是尝试加载内核的overlay模块,如果失败则忽略错误继续执行下面的命令。
  51. #
  52. # ExecStart=/usr/local/bin/containerd
  53. # 实际执行的命令,用于启动containerd容器运行时。
  54. #
  55. # Type=notify
  56. # 指定服务的通知类型。这里使用notify类型,表示当服务就绪时会通过通知的方式告知systemd。
  57. #
  58. # Delegate=yes
  59. # 允许systemd对此服务进行重启和停止操作。
  60. #
  61. # KillMode=process
  62. # 在终止容器运行时时使用的kill模式。这里使用process模式,表示通过终止进程来停止容器运行时。
  63. #
  64. # Restart=always
  65. # 定义了当容器运行时终止后的重启策略。这里设置为always,表示无论何时终止容器运行时,都会自动重新启动。
  66. #
  67. # RestartSec=5
  68. # 在容器运行时终止后重新启动之前等待的秒数。
  69. #
  70. # LimitNPROC=infinity
  71. # 指定容器运行时可以使用的最大进程数量。这里设置为无限制。
  72. #
  73. # LimitCORE=infinity
  74. # 指定容器运行时可以使用的最大CPU核心数量。这里设置为无限制。
  75. #
  76. # LimitNOFILE=infinity
  77. # 指定容器运行时可以打开的最大文件数。这里设置为无限制。
  78. #
  79. # TasksMax=infinity
  80. # 指定容器运行时可以创建的最大任务数。这里设置为无限制。
  81. #
  82. # OOMScoreAdjust=-999
  83. # 指定容器运行时的OOM(Out-Of-Memory)分数调整值。负数值表示容器运行时的优先级较高。
  84. #
  85. # [Install]
  86. # WantedBy=multi-user.target
  87. # 定义了服务的安装位置。这里指定为multi-user.target,表示将服务安装为多用户模式下的启动项。

2.1.1配置Containerd所需的模块

  1. cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
  2. overlay
  3. br_netfilter
  4. EOF
  5. # 参数解释:
  6. #
  7. # containerd是一个容器运行时,用于管理和运行容器。它支持多种不同的参数配置来自定义容器运行时的行为和功能。
  8. #
  9. # 1. overlay:overlay是容器d默认使用的存储驱动,它提供了一种轻量级的、可堆叠的、逐层增量的文件系统。它通过在现有文件系统上叠加文件系统层来创建容器的文件系统视图。每个容器可以有自己的一组文件系统层,这些层可以共享基础镜像中的文件,并在容器内部进行修改。使用overlay可以有效地使用磁盘空间,并使容器更加轻量级。
  10. #
  11. # 2. br_netfilter:br_netfilter是Linux内核提供的一个网络过滤器模块,用于在容器网络中进行网络过滤和NAT转发。当容器和主机之间的网络通信需要进行DNAT或者SNAT时,br_netfilter模块可以将IP地址进行转换。它还可以提供基于iptables规则的网络过滤功能,用于限制容器之间或容器与外部网络之间的通信。
  12. #
  13. # 这些参数可以在containerd的配置文件或者命令行中指定。例如,可以通过设置--storage-driver参数来选择使用overlay作为存储驱动,通过设置--iptables参数来启用或禁用br_netfilter模块。具体的使用方法和配置细节可以参考containerd的官方文档。

2.1.2加载模块

  1. systemctl restart systemd-modules-load.service
  2. # 参数解释:
  3. # - `systemctl`: 是Linux系统管理服务的命令行工具,可以管理systemd init系统。
  4. # - `restart`: 是systemctl命令的一个选项,用于重新启动服务。
  5. # - `systemd-modules-load.service`: 是一个系统服务,用于加载内核模块。
  6. #
  7. # 将上述参数结合在一起来解释`systemctl restart systemd-modules-load.service`的含义:
  8. # 这个命令用于重新启动系统服务`systemd-modules-load.service`,它是负责加载内核模块的服务。在重新启动该服务后,系统会重新加载所有的内核模块。

2.1.3配置Containerd所需的内核

  1. cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
  2. net.bridge.bridge-nf-call-iptables = 1
  3. net.ipv4.ip_forward = 1
  4. net.bridge.bridge-nf-call-ip6tables = 1
  5. EOF
  6. # 加载内核
  7. sysctl --system
  8. # 参数解释:
  9. #
  10. # 这些参数是Linux操作系统中用于网络和网络桥接设置的参数。
  11. #
  12. # - net.bridge.bridge-nf-call-iptables:这个参数控制网络桥接设备是否调用iptables规则处理网络数据包。当该参数设置为1时,网络数据包将被传递到iptables进行处理;当该参数设置为0时,网络数据包将绕过iptables直接传递。默认情况下,这个参数的值是1,即启用iptables规则处理网络数据包。
  13. #
  14. # - net.ipv4.ip_forward:这个参数用于控制是否启用IP转发功能。IP转发使得操作系统可以将接收到的数据包从一个网络接口转发到另一个网络接口。当该参数设置为1时,启用IP转发功能;当该参数设置为0时,禁用IP转发功能。在网络环境中,通常需要启用IP转发功能来实现不同网络之间的通信。默认情况下,这个参数的值是0,即禁用IP转发功能。
  15. #
  16. # - net.bridge.bridge-nf-call-ip6tables:这个参数与net.bridge.bridge-nf-call-iptables类似,但是它用于IPv6数据包的处理。当该参数设置为1时,IPv6数据包将被传递到ip6tables进行处理;当该参数设置为0时,IPv6数据包将绕过ip6tables直接传递。默认情况下,这个参数的值是1,即启用ip6tables规则处理IPv6数据包。
  17. #
  18. # 这些参数的值可以通过修改操作系统的配置文件(通常是'/etc/sysctl.conf')来进行设置。修改完成后,需要使用'sysctl -p'命令重载配置文件使参数生效。

2.1.4创建Containerd的配置文件

  1. # 参数解释:
  2. #
  3. # 这段代码是用于修改并配置containerd的参数。
  4. #
  5. # 1. 首先使用命令`mkdir -p /etc/containerd`创建/etc/containerd目录,如果该目录已存在,则不进行任何操作。
  6. # 2. 使用命令`containerd config default | tee /etc/containerd/config.toml`创建默认配置文件,并将输出同时传递给/etc/containerd/config.toml文件。
  7. # 3. 使用sed命令修改/etc/containerd/config.toml文件,将SystemdCgroup参数的值从false改为true。-i参数表示直接在原文件中进行编辑。
  8. # 4. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中SystemdCgroup参数的值是否已修改为true。
  9. # 5. 使用sed命令修改/etc/containerd/config.toml文件,将registry.k8s.io的地址替换为m.daocloud.io/registry.k8s.io。-i参数表示直接在原文件中进行编辑。
  10. # 6. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中sandbox_image参数的值是否已修改为m.daocloud.io/registry.k8s.io。
  11. # 7. 使用sed命令修改/etc/containerd/config.toml文件,将config_path参数的值从""改为"/etc/containerd/certs.d"。-i参数表示直接在原文件中进行编辑。
  12. # 8. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中certs.d参数的值是否已修改为/etc/containerd/certs.d。
  13. # 9. 使用mkdir命令创建/etc/containerd/certs.d/docker.io目录,如果目录已存在,则不进行任何操作。-p参数表示创建目录时,如果父级目录不存在,则自动创建父级目录。
  14. #
  15. # 最后,使用cat重定向操作符将内容写入/etc/containerd/certs.d/docker.io/hosts.toml文件。该文件会配置加速器,其中server参数设置为"https://docker.io",host参数设置为"https://hub-mirror.c.163.com",并添加capabilities参数。
  16. # 创建默认配置文件
  17. mkdir -p /etc/containerd
  18. containerd config default | tee /etc/containerd/config.toml
  19. # 修改Containerd的配置文件
  20. sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
  21. cat /etc/containerd/config.toml | grep SystemdCgroup
  22. sed -i "s#registry.k8s.io#m.daocloud.io/registry.k8s.io#g" /etc/containerd/config.toml
  23. cat /etc/containerd/config.toml | grep sandbox_image
  24. sed -i "s#config_path\ \=\ \"\"#config_path\ \=\ \"/etc/containerd/certs.d\"#g" /etc/containerd/config.toml
  25. cat /etc/containerd/config.toml | grep certs.d
  26. # 配置加速器
  27. mkdir /etc/containerd/certs.d/docker.io -pv
  28. cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
  29. server = "https://docker.io"
  30. [host."https://docker.mirrors.ustc.edu.cn"]
  31. capabilities = ["pull", "resolve"]
  32. EOF
  33. # 注意!
  34. # SystemdCgroup参数是containerd中的一个配置参数,用于设置containerd在运行过程中使用的Cgroup(控制组)路径。Containerd使用SystemdCgroup参数来指定应该使用哪个Cgroup来跟踪和管理容器的资源使用。
  35. #
  36. # Cgroup是Linux内核提供的一种资源隔离和管理机制,可以用于限制、分配和监控进程组的资源使用。使用Cgroup,可以将容器的资源限制和隔离,以防止容器之间的资源争用和不公平的竞争。
  37. #
  38. # 通过设置SystemdCgroup参数,可以确保containerd能够找到正确的Cgroup路径,并正确地限制和隔离容器的资源使用,确保容器可以按照预期的方式运行。如果未正确设置SystemdCgroup参数,可能会导致容器无法正确地使用资源,或者无法保证资源的公平分配和隔离。
  39. #
  40. # 总而言之,SystemdCgroup参数的作用是为了确保containerd能够正确地管理容器的资源使用,以实现资源的限制、隔离和公平分配。

2.1.5启动并设置为开机启动

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now containerd.service
  4. # 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。
  5. systemctl stop containerd.service
  6. # 停止运行中的docker.service单元,即停止Docker守护进程。
  7. systemctl start containerd.service
  8. # 启动docker.service单元,即启动Docker守护进程。
  9. systemctl restart containerd.service
  10. # 重启docker.service单元,即重新启动Docker守护进程。
  11. systemctl status containerd.service
  12. # 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。

2.1.6配置crictl客户端连接的运行时位置

  1. # https://github.com/kubernetes-sigs/cri-tools/releases/
  2. # wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.29.0/crictl-v1.29.0-linux-amd64.tar.gz
  3. #解压
  4. tar xf crictl-v*-linux-amd64.tar.gz -C /usr/bin/
  5. #生成配置文件
  6. cat > /etc/crictl.yaml <<EOF
  7. runtime-endpoint: unix:///run/containerd/containerd.sock
  8. image-endpoint: unix:///run/containerd/containerd.sock
  9. timeout: 10
  10. debug: false
  11. EOF
  12. #测试
  13. systemctl restart containerd
  14. crictl info
  15. # 注意!
  16. # 下面是参数`crictl`的详细解释
  17. #
  18. # `crictl`是一个用于与容器运行时通信的命令行工具。它是容器运行时接口(CRI)工具的一个实现,可以对容器运行时进行管理和操作。
  19. #
  20. # 1. `runtime-endpoint: unix:///run/containerd/containerd.sock`
  21. # 指定容器运行时的终端套接字地址。在这个例子中,指定的地址是`unix:///run/containerd/containerd.sock`,这是一个Unix域套接字地址。
  22. #
  23. # 2. `image-endpoint: unix:///run/containerd/containerd.sock`
  24. # 指定容器镜像服务的终端套接字地址。在这个例子中,指定的地址是`unix:///run/containerd/containerd.sock`,这是一个Unix域套接字地址。
  25. #
  26. # 3. `timeout: 10`
  27. # 设置与容器运行时通信的超时时间,单位是秒。在这个例子中,超时时间被设置为10秒。
  28. #
  29. # 4. `debug: false`
  30. # 指定是否开启调式模式。在这个例子中,调式模式被设置为关闭,即`false`。如果设置为`true`,则会输出更详细的调试信息。
  31. #
  32. # 这些参数可以根据需要进行修改,以便与容器运行时进行有效的通信和管理。

2.2 安装docker作为Runtime

2.2.1 解压docker程序

  1. # 二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/
  2. # wget https://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-25.0.3.tgz
  3. #解压
  4. tar xf docker-*.tgz
  5. #拷贝二进制文件
  6. cp docker/* /usr/bin/

2.2.2 创建containerd的service文件

  1. #创建containerd的service文件,并且启动
  2. cat >/etc/systemd/system/containerd.service <<EOF
  3. [Unit]
  4. Description=containerd container runtime
  5. Documentation=https://containerd.io
  6. After=network.target local-fs.target
  7. [Service]
  8. ExecStartPre=-/sbin/modprobe overlay
  9. ExecStart=/usr/bin/containerd
  10. Type=notify
  11. Delegate=yes
  12. KillMode=process
  13. Restart=always
  14. RestartSec=5
  15. LimitNPROC=infinity
  16. LimitCORE=infinity
  17. LimitNOFILE=1048576
  18. TasksMax=infinity
  19. OOMScoreAdjust=-999
  20. [Install]
  21. WantedBy=multi-user.target
  22. EOF
  23. # 参数解释:
  24. #
  25. # [Unit]
  26. # - Description=containerd container runtime:指定服务的描述信息。
  27. # - Documentation=https://containerd.io:指定服务的文档链接。
  28. # - After=network.target local-fs.target:指定服务的启动顺序,在网络和本地文件系统启动之后再启动该服务。
  29. #
  30. # [Service]
  31. # - ExecStartPre=-/sbin/modprobe overlay:在启动服务之前执行的命令,使用`-`表示忽略错误。
  32. # - ExecStart=/usr/bin/containerd:指定服务的启动命令。
  33. # - Type=notify:指定服务的类型,`notify`表示服务会在启动完成后向systemd发送通知。
  34. # - Delegate=yes:允许服务代理其他服务的应答,例如收到关机命令后终止其他服务。
  35. # - KillMode=process:指定服务终止时的行为,`process`表示终止服务进程。
  36. # - Restart=always:指定服务终止后是否自动重启,`always`表示总是自动重启。
  37. # - RestartSec=5:指定服务重启的时间间隔,单位为秒。
  38. # - LimitNPROC=infinity:限制服务的最大进程数,`infinity`表示没有限制。
  39. # - LimitCORE=infinity:限制服务的最大核心数,`infinity`表示没有限制。
  40. # - LimitNOFILE=1048576:限制服务的最大文件数,指定为1048576。
  41. # - TasksMax=infinity:限制服务的最大任务数,`infinity`表示没有限制。
  42. # - OOMScoreAdjust=-999:指定服务的OOM(Out of Memory)得分,负数表示降低被终止的概率。
  43. #
  44. # [Install]
  45. # - WantedBy=multi-user.target:指定服务的安装方式,`multi-user.target`表示该服务在多用户模式下安装。
  46. # 设置开机自启
  47. systemctl enable --now containerd.service

2.2.3 准备docker的service文件

  1. #准备docker的service文件
  2. cat > /etc/systemd/system/docker.service <<EOF
  3. [Unit]
  4. Description=Docker Application Container Engine
  5. Documentation=https://docs.docker.com
  6. After=network-online.target firewalld.service containerd.service
  7. Wants=network-online.target
  8. Requires=docker.socket containerd.service
  9. [Service]
  10. Type=notify
  11. ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
  12. ExecReload=/bin/kill -s HUP $MAINPID
  13. TimeoutSec=0
  14. RestartSec=2
  15. Restart=always
  16. StartLimitBurst=3
  17. StartLimitInterval=60s
  18. LimitNOFILE=infinity
  19. LimitNPROC=infinity
  20. LimitCORE=infinity
  21. TasksMax=infinity
  22. Delegate=yes
  23. KillMode=process
  24. OOMScoreAdjust=-500
  25. [Install]
  26. WantedBy=multi-user.target
  27. EOF
  28. # 参数解释:
  29. #
  30. # [Unit]
  31. # - Description: 描述服务的作用,这里是Docker Application Container Engine,即Docker应用容器引擎。
  32. # - Documentation: 提供关于此服务的文档链接,这里是Docker官方文档链接。
  33. # - After: 说明该服务在哪些其他服务之后启动,这里是在网络在线、firewalld服务和containerd服务后启动。
  34. # - Wants: 说明该服务想要的其他服务,这里是网络在线服务。
  35. # - Requires: 说明该服务需要的其他服务,这里是docker.socket和containerd.service。
  36. #
  37. # [Service]
  38. # - Type: 服务类型,这里是notify,表示服务在启动完成时发送通知。
  39. # - ExecStart: 命令,启动该服务时会执行的命令,这里是/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock,即启动dockerd并指定一些参数,其中-H指定dockerd的监听地址为fd://,--containerd指定containerd的sock文件位置。
  40. # - ExecReload: 重载命令,当接收到HUP信号时执行的命令,这里是/bin/kill -s HUP $MAINPID,即发送HUP信号给主进程ID。
  41. # - TimeoutSec: 服务超时时间,这里是0,表示没有超时限制。
  42. # - RestartSec: 重启间隔时间,这里是2秒,表示重启失败后等待2秒再重启。
  43. # - Restart: 重启策略,这里是always,表示总是重启。
  44. # - StartLimitBurst: 启动限制次数,这里是3,表示在启动失败后最多重试3次。
  45. # - StartLimitInterval: 启动限制时间间隔,这里是60秒,表示两次启动之间最少间隔60秒。
  46. # - LimitNOFILE: 文件描述符限制,这里是infinity,表示没有限制。
  47. # - LimitNPROC: 进程数限制,这里是infinity,表示没有限制。
  48. # - LimitCORE: 核心转储限制,这里是infinity,表示没有限制。
  49. # - TasksMax: 最大任务数,这里是infinity,表示没有限制。
  50. # - Delegate: 修改权限,这里是yes,表示启用权限修改。
  51. # - KillMode: 杀死模式,这里是process,表示杀死整个进程组。
  52. # - OOMScoreAdjust: 用于调整进程在系统内存紧张时的优先级调整,这里是-500,表示将OOM分数降低500。
  53. #
  54. # [Install]
  55. # - WantedBy: 安装目标,这里是multi-user.target,表示在多用户模式下安装。
  56. # 在WantedBy参数中,我们可以使用以下参数:
  57. # 1. multi-user.target:指定该服务应该在多用户模式下启动。
  58. # 2. graphical.target:指定该服务应该在图形化界面模式下启动。
  59. # 3. default.target:指定该服务应该在系统的默认目标(runlevel)下启动。
  60. # 4. rescue.target:指定该服务应该在系统救援模式下启动。
  61. # 5. poweroff.target:指定该服务应该在关机时启动。
  62. # 6. reboot.target:指定该服务应该在重启时启动。
  63. # 7. halt.target:指定该服务应该在停止时启动。
  64. # 8. shutdown.target:指定该服务应该在系统关闭时启动。
  65. # 这些参数可以根据需要选择一个或多个,以告知系统在何时启动该服务。

2.2.4 准备docker的socket文件

  1. #准备docker的socket文件
  2. cat > /etc/systemd/system/docker.socket <<EOF
  3. [Unit]
  4. Description=Docker Socket for the API
  5. [Socket]
  6. ListenStream=/var/run/docker.sock
  7. SocketMode=0660
  8. SocketUser=root
  9. SocketGroup=docker
  10. [Install]
  11. WantedBy=sockets.target
  12. EOF
  13. # 这是一个用于Docker API的socket配置文件,包含了以下参数:
  14. #
  15. # [Unit]
  16. # - Description:描述了该socket的作用,即为Docker API的socket。
  17. #
  18. # [Socket]
  19. # - ListenStream:指定了socket的监听地址,该socket会监听在/var/run/docker.sock上,即Docker守护程序使用的默认sock文件。
  20. # - SocketMode:指定了socket文件的权限模式,此处为0660,即用户和用户组有读写权限,其他用户无权限。
  21. # - SocketUser:指定了socket文件的所有者,此处为root用户。
  22. # - SocketGroup:指定了socket文件的所属用户组,此处为docker用户组。
  23. #
  24. # [Install]
  25. # - WantedBy:指定了该socket被启用时的目标,此处为sockets.target,表示当sockets.target启动时启用该socket。
  26. #
  27. # 该配置文件的作用是为Docker提供API访问的通道,它监听在/var/run/docker.sock上,具有root用户权限,但只接受docker用户组的成员的连接,并且其他用户无法访问。这样,只有docker用户组的成员可以通过该socket与Docker守护进程进行通信。

2.2.5 配置加速器

  1. # 配置加速器
  2. mkdir /etc/docker/ -pv
  3. cat >/etc/docker/daemon.json <<EOF
  4. {
  5. "exec-opts": ["native.cgroupdriver=systemd"],
  6. "registry-mirrors": [
  7. "https://docker.mirrors.ustc.edu.cn"
  8. ],
  9. "max-concurrent-downloads": 10,
  10. "log-driver": "json-file",
  11. "log-level": "warn",
  12. "log-opts": {
  13. "max-size": "10m",
  14. "max-file": "3"
  15. },
  16. "data-root": "/var/lib/docker"
  17. }
  18. EOF
  19. # 该参数文件中包含以下参数:
  20. #
  21. # 1. exec-opts: 用于设置Docker守护进程的选项,native.cgroupdriver=systemd表示使用systemd作为Cgroup驱动程序。
  22. # 2. registry-mirrors: 用于指定Docker镜像的镜像注册服务器。在这里有三个镜像注册服务器:https://docker.m.daocloud.io、https://docker.mirrors.ustc.edu.cn和http://hub-mirror.c.163.com。
  23. # 3. max-concurrent-downloads: 用于设置同时下载镜像的最大数量,默认值为3,这里设置为10。
  24. # 4. log-driver: 用于设置Docker守护进程的日志驱动程序,这里设置为json-file。
  25. # 5. log-level: 用于设置日志的级别,这里设置为warn。
  26. # 6. log-opts: 用于设置日志驱动程序的选项,这里有两个选项:max-size和max-file。max-size表示每个日志文件的最大大小,这里设置为10m,max-file表示保存的最大日志文件数量,这里设置为3。
  27. # 7. data-root: 用于设置Docker守护进程的数据存储根目录,默认为/var/lib/docker,这里设置为/var/lib/docker。

2.2.6 启动docker

  1. groupadd docker
  2. #创建docker组
  3. systemctl daemon-reload
  4. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  5. systemctl enable --now docker.socket
  6. # 启用并立即启动docker.socket单元。docker.socket是一个systemd的socket单元,用于接收来自网络的Docker API请求。
  7. systemctl enable --now docker.service
  8. # 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。
  9. systemctl stop docker.service
  10. # 停止运行中的docker.service单元,即停止Docker守护进程。
  11. systemctl start docker.service
  12. # 启动docker.service单元,即启动Docker守护进程。
  13. systemctl restart docker.service
  14. # 重启docker.service单元,即重新启动Docker守护进程。
  15. systemctl status docker.service
  16. # 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。
  17. docker info
  18. #验证

2.2.7 解压cri-docker

  1. # 由于1.24以及更高版本不支持docker所以安装cri-docker
  2. # 下载cri-docker
  3. # https://github.com/Mirantis/cri-dockerd/releases/
  4. # wget https://mirrors.chenby.cn/https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
  5. # 解压cri-docker
  6. tar xvf cri-dockerd-*.amd64.tgz
  7. cp -r cri-dockerd/ /usr/bin/
  8. chmod +x /usr/bin/cri-dockerd/cri-dockerd

2.2.8 写入启动cri-docker配置文件

  1. # 写入启动配置文件
  2. cat > /usr/lib/systemd/system/cri-docker.service <<EOF
  3. [Unit]
  4. Description=CRI Interface for Docker Application Container Engine
  5. Documentation=https://docs.mirantis.com
  6. After=network-online.target firewalld.service docker.service
  7. Wants=network-online.target
  8. Requires=cri-docker.socket
  9. [Service]
  10. Type=notify
  11. ExecStart=/usr/bin/cri-dockerd/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
  12. ExecReload=/bin/kill -s HUP $MAINPID
  13. TimeoutSec=0
  14. RestartSec=2
  15. Restart=always
  16. StartLimitBurst=3
  17. StartLimitInterval=60s
  18. LimitNOFILE=infinity
  19. LimitNPROC=infinity
  20. LimitCORE=infinity
  21. TasksMax=infinity
  22. Delegate=yes
  23. KillMode=process
  24. [Install]
  25. WantedBy=multi-user.target
  26. EOF
  27. # [Unit]
  28. # - Description:该参数用于描述该单元的功能,这里描述的是CRI与Docker应用容器引擎的接口。
  29. # - Documentation:该参数指定了相关文档的网址,供用户参考。
  30. # - After:该参数指定了此单元应该在哪些其他单元之后启动,确保在网络在线、防火墙和Docker服务启动之后再启动此单元。
  31. # - Wants:该参数指定了此单元希望也启动的所有单元,此处是希望在网络在线之后启动。
  32. # - Requires:该参数指定了此单元需要依赖的单元,此处是cri-docker.socket单元。
  33. #
  34. # [Service]
  35. # - Type:该参数指定了服务的类型,这里是notify,表示当服务启动完成时向系统发送通知。
  36. # - ExecStart:该参数指定了将要运行的命令和参数,此处是执行/usr/bin/cri-dockerd/cri-dockerd命令,并指定了网络插件为cni和Pod基础设施容器的镜像为registry.aliyuncs.com/google_containers/pause:3.7。
  37. # - ExecReload:该参数指定在服务重载时运行的命令,此处是发送HUP信号给主进程。
  38. # - TimeoutSec:该参数指定了服务启动的超时时间,此处为0,表示无限制。
  39. # - RestartSec:该参数指定了自动重启服务的时间间隔,此处为2秒。
  40. # - Restart:该参数指定了在服务发生错误时自动重启,此处是始终重启。
  41. # - StartLimitBurst:该参数指定了在给定时间间隔内允许的启动失败次数,此处为3次。
  42. # - StartLimitInterval:该参数指定启动失败的时间间隔,此处为60秒。
  43. # - LimitNOFILE:该参数指定了允许打开文件的最大数量,此处为无限制。
  44. # - LimitNPROC:该参数指定了允许同时运行的最大进程数,此处为无限制。
  45. # - LimitCORE:该参数指定了允许生成的core文件的最大大小,此处为无限制。
  46. # - TasksMax:该参数指定了此服务的最大任务数,此处为无限制。
  47. # - Delegate:该参数指定了是否将控制权委托给指定服务,此处为是。
  48. # - KillMode:该参数指定了在终止服务时如何处理进程,此处是通过终止进程来终止服务。
  49. #
  50. # [Install]
  51. # - WantedBy:该参数指定了希望这个单元启动的多用户目标。在这里,这个单元希望在multi-user.target启动。

2.2.9 写入cri-docker的socket配置文件

  1. # 写入socket配置文件
  2. cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
  3. [Unit]
  4. Description=CRI Docker Socket for the API
  5. PartOf=cri-docker.service
  6. [Socket]
  7. ListenStream=%t/cri-dockerd.sock
  8. SocketMode=0660
  9. SocketUser=root
  10. SocketGroup=docker
  11. [Install]
  12. WantedBy=sockets.target
  13. EOF
  14. # 该配置文件是用于systemd的单元配置文件(unit file),用于定义一个socket单元。
  15. #
  16. # [Unit]
  17. # - Description:表示该单元的描述信息。
  18. # - PartOf:表示该单元是cri-docker.service的一部分。
  19. #
  20. # [Socket]
  21. # - ListenStream:指定了该socket要监听的地址和端口,这里使用了%t占位符,表示根据单元的类型来决定路径。%t/cri-dockerd.sock表示将监听Unix域套接字cri-dockerd.sock。Unix域套接字用于在同一台主机上的进程之间通信。
  22. # - SocketMode:指定了socket文件的权限模式,此处为0660,即用户和用户组有读写权限,其他用户无权限。
  23. # - SocketUser:指定了socket文件的所有者,此处为root用户。
  24. # - SocketGroup:指定了socket文件的所属用户组,此处为docker用户组。
  25. #
  26. # [Install]
  27. # - WantedBy:部分定义了该单元的安装配置信息。WantedBy=sockets.target表示当sockets.target单元启动时,自动启动该socket单元。sockets.target是一个系统服务,用于管理所有的socket单元。

2.2.10 启动cri-docker

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now cri-docker.service
  4. # 启用并立即启动cri-docker.service单元。cri-docker.service是cri-docker守护进程的systemd服务单元。
  5. systemctl restart cri-docker.service
  6. # 重启cri-docker.service单元,即重新启动cri-docker守护进程。
  7. systemctl status docker.service
  8. # 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。

2.3.k8s与etcd下载及安装(仅在master01操作)

2.3.1解压k8s安装包

  1. # 下载安装包
  2. # wget https://mirrors.chenby.cn/https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gz
  3. # wget https://dl.k8s.io/v1.29.2/kubernetes-server-linux-amd64.tar.gz
  4. # 解压k8s安装文件
  5. cd cby
  6. tar -xf kubernetes-server-linux-amd64.tar.gz --strip-components=3 -C /usr/local/bin kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}
  7. # 这是一个tar命令,用于解压指定的kubernetes-server-linux-amd64.tar.gz文件,并将其中的特定文件提取到/usr/local/bin目录下。
  8. #
  9. # 命令的解释如下:
  10. # - tar:用于处理tar压缩文件的命令。
  11. # - -xf:表示解压操作。
  12. # - kubernetes-server-linux-amd64.tar.gz:要解压的文件名。
  13. # - --strip-components=3:表示解压时忽略压缩文件中的前3级目录结构,提取文件时直接放到目标目录中。
  14. # - -C /usr/local/bin:指定提取文件的目标目录为/usr/local/bin。
  15. # - kubernetes/server/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy}:要解压和提取的文件名模式,用花括号括起来表示模式中的多个可能的文件名。
  16. #
  17. # 总的来说,这个命令的作用是将kubernetes-server-linux-amd64.tar.gz文件中的kubelet、kubectl、kube-apiserver、kube-controller-manager、kube-scheduler和kube-proxy六个文件提取到/usr/local/bin目录下,同时忽略文件路径中的前三级目录结构。
  18. # 解压etcd安装文件
  19. tar -xf etcd*.tar.gz && mv etcd-*/etcd /usr/local/bin/ && mv etcd-*/etcdctl /usr/local/bin/
  20. # 这是一个将文件解压并移动到特定目录的命令。这是一个用于 Linux 系统中的命令。
  21. #
  22. # - tar -xf etcd*.tar.gz:这个命令将解压以 etcd 开头并以.tar.gz 结尾的文件。`-xf` 是使用 `tar` 命令的选项,它表示解压文件并展开其中的内容。
  23. # - mv etcd-*/etcd /usr/local/bin/:这个命令将 etcd 文件移动到 /usr/local/bin 目录。`mv` 是移动命令,它将 etcd-*/etcd 路径下的 etcd 文件移动到了 /usr/local/bin 目录。
  24. # - mv etcd-*/etcdctl /usr/local/bin/:这个命令将 etcdctl 文件移动到 /usr/local/bin 目录,和上一条命令类似。
  25. #
  26. # 总结起来,以上命令将从名为 etcd*.tar.gz 的压缩文件中解压出 etcd 和 etcdctl 文件,并将它们移动到 /usr/local/bin 目录中。
  27. # 查看/usr/local/bin下内容
  28. ls /usr/local/bin/
  29. containerd crictl etcdctl kube-proxy
  30. containerd-shim critest kube-apiserver kube-scheduler
  31. containerd-shim-runc-v1 ctd-decoder kube-controller-manager
  32. containerd-shim-runc-v2 ctr kubectl
  33. containerd-stress etcd kubelet

2.3.2查看版本

  1. [root@k8s-master01 ~]# kubelet --version
  2. Kubernetes v1.29.2
  3. [root@k8s-master01 ~]# etcdctl version
  4. etcdctl version: 3.5.12
  5. API version: 3.5
  6. [root@k8s-master01 ~]#

2.3.3将组件发送至其他k8s节点

  1. Master='k8s-master02 k8s-master03'
  2. Work='k8s-node01 k8s-node02'
  3. # 拷贝master组件
  4. for NODE in $Master; do echo $NODE; scp /usr/local/bin/kube{let,ctl,-apiserver,-controller-manager,-scheduler,-proxy} $NODE:/usr/local/bin/; scp /usr/local/bin/etcd* $NODE:/usr/local/bin/; done
  5. # 该命令是一个for循环,对于在$Master变量中的每个节点,执行以下操作:
  6. #
  7. # 1. 打印出节点的名称。
  8. # 2. 使用scp命令将/usr/local/bin/kubelet、kubectl、kube-apiserver、kube-controller-manager、kube-scheduler和kube-proxy文件复制到节点的/usr/local/bin/目录下。
  9. # 3. 使用scp命令将/usr/local/bin/etcd*文件复制到节点的/usr/local/bin/目录下。
  10. # 拷贝work组件
  11. for NODE in $Work; do echo $NODE; scp /usr/local/bin/kube{let,-proxy} $NODE:/usr/local/bin/ ; done
  12. # 该命令是一个for循环,对于在$Master变量中的每个节点,执行以下操作:
  13. #
  14. # 1. 打印出节点的名称。
  15. # 2. 使用scp命令将/usr/local/bin/kubelet和kube-proxy文件复制到节点的/usr/local/bin/目录下。
  16. # 所有节点执行
  17. mkdir -p /opt/cni/bin

2.3创建证书相关文件

  1. # 请查看Github仓库 或者进行获取已经打好的包
  2. https://github.com/cby-chen/Kubernetes/
  3. https://github.com/cby-chen/Kubernetes/tags
  4. https://github.com/cby-chen/Kubernetes/releases/download/v1.29.2/kubernetes-v1.29.2.tar

3.相关证书生成

  1. # master01节点下载证书生成工具
  2. # wget "https://mirrors.chenby.cn/https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssl_1.6.4_linux_amd64" -O /usr/local/bin/cfssl
  3. # wget "https://mirrors.chenby.cn/https://github.com/cloudflare/cfssl/releases/download/v1.6.4/cfssljson_1.6.4_linux_amd64" -O /usr/local/bin/cfssljson
  4. # 软件包内有
  5. cp cfssl_*_linux_amd64 /usr/local/bin/cfssl
  6. cp cfssljson_*_linux_amd64 /usr/local/bin/cfssljson
  7. # 添加执行权限
  8. chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson

3.1.生成etcd证书

特别说明除外,以下操作在所有master节点操作

3.1.1所有master节点创建证书存放目录

  1. mkdir /etc/etcd/ssl -p

3.1.2master01节点生成etcd证书

  1. # 写入生成证书所需的配置文件
  2. cat > ca-config.json << EOF
  3. {
  4. "signing": {
  5. "default": {
  6. "expiry": "876000h"
  7. },
  8. "profiles": {
  9. "kubernetes": {
  10. "usages": [
  11. "signing",
  12. "key encipherment",
  13. "server auth",
  14. "client auth"
  15. ],
  16. "expiry": "876000h"
  17. }
  18. }
  19. }
  20. }
  21. EOF
  22. # 这段配置文件是用于配置加密和认证签名的一些参数。
  23. #
  24. # 在这里,有两个部分:`signing`和`profiles`。
  25. #
  26. # `signing`包含了默认签名配置和配置文件。
  27. # 默认签名配置`default`指定了证书的过期时间为`876000h`。`876000h`表示证书有效期为100年。
  28. #
  29. # `profiles`部分定义了不同的证书配置文件。
  30. # 在这里,只有一个配置文件`kubernetes`。它包含了以下`usages`和过期时间`expiry`:
  31. #
  32. # 1. `signing`:用于对其他证书进行签名
  33. # 2. `key encipherment`:用于加密和解密传输数据
  34. # 3. `server auth`:用于服务器身份验证
  35. # 4. `client auth`:用于客户端身份验证
  36. #
  37. # 对于`kubernetes`配置文件,证书的过期时间也是`876000h`,即100年。
  38. cat > etcd-ca-csr.json << EOF
  39. {
  40. "CN": "etcd",
  41. "key": {
  42. "algo": "rsa",
  43. "size": 2048
  44. },
  45. "names": [
  46. {
  47. "C": "CN",
  48. "ST": "Beijing",
  49. "L": "Beijing",
  50. "O": "etcd",
  51. "OU": "Etcd Security"
  52. }
  53. ],
  54. "ca": {
  55. "expiry": "876000h"
  56. }
  57. }
  58. EOF
  59. # 这是一个用于生成证书签名请求(Certificate Signing Request,CSR)的JSON配置文件。JSON配置文件指定了生成证书签名请求所需的数据。
  60. #
  61. # - "CN": "etcd" 指定了希望生成的证书的CN字段(Common Name),即证书的主题,通常是该证书标识的实体的名称。
  62. # - "key": {} 指定了生成证书所使用的密钥的配置信息。"algo": "rsa" 指定了密钥的算法为RSA,"size": 2048 指定了密钥的长度为2048位。
  63. # - "names": [] 包含了生成证书时所需的实体信息。在这个例子中,只包含了一个实体,其相关信息如下:
  64. # - "C": "CN" 指定了实体的国家/地区代码,这里是中国。
  65. # - "ST": "Beijing" 指定了实体所在的省/州。
  66. # - "L": "Beijing" 指定了实体所在的城市。
  67. # - "O": "etcd" 指定了实体的组织名称。
  68. # - "OU": "Etcd Security" 指定了实体所属的组织单位。
  69. # - "ca": {} 指定了生成证书时所需的CA(Certificate Authority)配置信息。
  70. # - "expiry": "876000h" 指定了证书的有效期,这里是876000小时。
  71. #
  72. # 生成证书签名请求时,可以使用这个JSON配置文件作为输入,根据配置文件中的信息生成相应的CSR文件。然后,可以将CSR文件发送给CA进行签名,以获得有效的证书。
  73. # 生成etcd证书和etcd证书的key(如果你觉得以后可能会扩容,可以在ip那多写几个预留出来)
  74. # 若没有IPv6 可删除可保留
  75. cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare /etc/etcd/ssl/etcd-ca
  76. # 具体的解释如下:
  77. #
  78. # cfssl是一个用于生成TLS/SSL证书的工具,它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。
  79. #
  80. # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA(证书颁发机构)。CA是用于签发其他证书的根证书。etcd-ca-csr.json是一个JSON格式的配置文件,其中包含了CA的详细信息,如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。
  81. #
  82. # | 符号表示将上一个命令的输出作为下一个命令的输入。
  83. #
  84. # cfssljson是cfssl工具的一个子命令,用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书,即只生成证书文件,不包含其他格式的文件。/etc/etcd/ssl/etcd-ca是指定生成的证书文件的路径和名称。
  85. #
  86. # 所以,这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书,并将证书文件保存在/etc/etcd/ssl/etcd-ca路径下。
  87. cat > etcd-csr.json << EOF
  88. {
  89. "CN": "etcd",
  90. "key": {
  91. "algo": "rsa",
  92. "size": 2048
  93. },
  94. "names": [
  95. {
  96. "C": "CN",
  97. "ST": "Beijing",
  98. "L": "Beijing",
  99. "O": "etcd",
  100. "OU": "Etcd Security"
  101. }
  102. ]
  103. }
  104. EOF
  105. # 这段代码是一个JSON格式的配置文件,用于生成一个证书签名请求(Certificate Signing Request,CSR)。
  106. #
  107. # 首先,"CN"字段指定了该证书的通用名称(Common Name),这里设为"etcd"。
  108. #
  109. # 接下来,"key"字段指定了密钥的算法("algo"字段)和长度("size"字段),此处使用的是RSA算法,密钥长度为2048位。
  110. #
  111. # 最后,"names"字段是一个数组,其中包含了一个名字对象,用于指定证书中的一些其他信息。这个名字对象包含了以下字段:
  112. # - "C"字段指定了国家代码(Country),这里设置为"CN"。
  113. # - "ST"字段指定了省份(State)或地区,这里设置为"Beijing"。
  114. # - "L"字段指定了城市(Locality),这里设置为"Beijing"。
  115. # - "O"字段指定了组织(Organization),这里设置为"etcd"。
  116. # - "OU"字段指定了组织单元(Organizational Unit),这里设置为"Etcd Security"。
  117. #
  118. # 这些字段将作为证书的一部分,用于标识和验证证书的使用范围和颁发者等信息。
  119. cfssl gencert -ca=/etc/etcd/ssl/etcd-ca.pem -ca-key=/etc/etcd/ssl/etcd-ca-key.pem -config=ca-config.json -hostname=127.0.0.1,k8s-master01,k8s-master02,k8s-master03,192.168.1.31,192.168.1.32,192.168.1.33,fc00:43f4:1eea:1::10,fc00:43f4:1eea:1::20,fc00:43f4:1eea:1::30,::1 -profile=kubernetes etcd-csr.json | cfssljson -bare /etc/etcd/ssl/etcd
  120. # 这是一条使用cfssl生成etcd证书的命令,下面是各个参数的解释:
  121. #
  122. # -ca=/etc/etcd/ssl/etcd-ca.pem:指定用于签名etcd证书的CA文件的路径。
  123. # -ca-key=/etc/etcd/ssl/etcd-ca-key.pem:指定用于签名etcd证书的CA私钥文件的路径。
  124. # -config=ca-config.json:指定CA配置文件的路径,该文件定义了证书的有效期、加密算法等设置。
  125. # -hostname=xxxx:指定要为etcd生成证书的主机名和IP地址列表。
  126. # -profile=kubernetes:指定使用的证书配置文件,该文件定义了证书的用途和扩展属性。
  127. # etcd-csr.json:指定etcd证书请求的JSON文件的路径,该文件包含了证书请求的详细信息。
  128. # | cfssljson -bare /etc/etcd/ssl/etcd:通过管道将cfssl命令的输出传递给cfssljson命令,并使用-bare参数指定输出文件的前缀路径,这里将生成etcd证书的.pem和-key.pem文件。
  129. #
  130. # 这条命令的作用是使用指定的CA证书和私钥,根据证书请求的JSON文件和配置文件生成etcd的证书文件。

3.1.3将证书复制到其他节点

  1. Master='k8s-master02 k8s-master03'
  2. for NODE in $Master; do ssh $NODE "mkdir -p /etc/etcd/ssl"; for FILE in etcd-ca-key.pem etcd-ca.pem etcd-key.pem etcd.pem; do scp /etc/etcd/ssl/${FILE} $NODE:/etc/etcd/ssl/${FILE}; done; done
  3. # 这个命令是一个简单的for循环,在一个由`$Master`存储的主机列表中迭代执行。对于每个主机,它使用`ssh`命令登录到主机,并在远程主机上创建一个名为`/etc/etcd/ssl`的目录(如果不存在)。接下来,它使用`scp`将本地主机上`/etc/etcd/ssl`目录中的四个文件(`etcd-ca-key.pem`,`etcd-ca.pem`,`etcd-key.pem`和`etcd.pem`)复制到远程主机的`/etc/etcd/ssl`目录中。最终的结果是,远程主机上的`/etc/etcd/ssl`目录中包含与本地主机上相同的四个文件的副本。

3.2.生成k8s相关证书

特别说明除外,以下操作在所有master节点操作

3.2.1 所有k8s节点创建证书存放目录

  1. mkdir -p /etc/kubernetes/pki

3.2.2 master01节点生成k8s证书

  1. # 写入生成证书所需的配置文件
  2. cat > ca-csr.json << EOF
  3. {
  4. "CN": "kubernetes",
  5. "key": {
  6. "algo": "rsa",
  7. "size": 2048
  8. },
  9. "names": [
  10. {
  11. "C": "CN",
  12. "ST": "Beijing",
  13. "L": "Beijing",
  14. "O": "Kubernetes",
  15. "OU": "Kubernetes-manual"
  16. }
  17. ],
  18. "ca": {
  19. "expiry": "876000h"
  20. }
  21. }
  22. EOF
  23. # 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息:
  24. #
  25. # - CN:CommonName,即用于标识证书的通用名称。在此配置中,CN 设置为 "kubernetes",表示该证书是用于 Kubernetes。
  26. # - key:用于生成证书的算法和大小。在此配置中,使用的算法是 RSA,大小是 2048 位。
  27. # - names:用于证书中的名称字段的详细信息。在此配置中,有以下字段信息:
  28. # - C:Country,即国家。在此配置中,设置为 "CN"。
  29. # - ST:State,即省/州。在此配置中,设置为 "Beijing"。
  30. # - L:Locality,即城市。在此配置中,设置为 "Beijing"。
  31. # - O:Organization,即组织。在此配置中,设置为 "Kubernetes"。
  32. # - OU:Organization Unit,即组织单位。在此配置中,设置为 "Kubernetes-manual"。
  33. # - ca:用于证书签名的证书颁发机构(CA)的配置信息。在此配置中,设置了证书的有效期为 876000 小时。
  34. #
  35. # 这个配置文件可以用于生成 Kubernetes 相关的证书,以确保集群中的通信安全性。
  36. cfssl gencert -initca ca-csr.json | cfssljson -bare /etc/kubernetes/pki/ca
  37. # 具体的解释如下:
  38. #
  39. # cfssl是一个用于生成TLS/SSL证书的工具,它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。
  40. #
  41. # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA(证书颁发机构)。CA是用于签发其他证书的根证书。ca-csr.json是一个JSON格式的配置文件,其中包含了CA的详细信息,如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。
  42. #
  43. # | 符号表示将上一个命令的输出作为下一个命令的输入。
  44. #
  45. # cfssljson是cfssl工具的一个子命令,用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书,即只生成证书文件,不包含其他格式的文件。/etc/kubernetes/pki/ca是指定生成的证书文件的路径和名称。
  46. #
  47. # 所以,这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书,并将证书文件保存在/etc/kubernetes/pki/ca路径下。
  48. cat > apiserver-csr.json << EOF
  49. {
  50. "CN": "kube-apiserver",
  51. "key": {
  52. "algo": "rsa",
  53. "size": 2048
  54. },
  55. "names": [
  56. {
  57. "C": "CN",
  58. "ST": "Beijing",
  59. "L": "Beijing",
  60. "O": "Kubernetes",
  61. "OU": "Kubernetes-manual"
  62. }
  63. ]
  64. }
  65. EOF
  66. # 这是一个用于生成 Kubernetes 相关证书的配置文件。该配置文件中包含以下信息:
  67. #
  68. # - `CN` 字段指定了证书的通用名称 (Common Name),这里设置为 "kube-apiserver",表示该证书用于 Kubernetes API Server。
  69. # - `key` 字段指定了生成证书时所选用的加密算法和密钥长度。这里选用了 RSA 算法,密钥长度为 2048 位。
  70. # - `names` 字段包含了一组有关证书持有者信息的项。这里使用了以下信息:
  71. # - `C` 表示国家代码 (Country),这里设置为 "CN" 表示中国。
  72. # - `ST` 表示州或省份 (State),这里设置为 "Beijing" 表示北京市。
  73. # - `L` 表示城市或地区 (Location),这里设置为 "Beijing" 表示北京市。
  74. # - `O` 表示组织名称 (Organization),这里设置为 "Kubernetes" 表示 Kubernetes。
  75. # - `OU` 表示组织单位 (Organizational Unit),这里设置为 "Kubernetes-manual" 表示手动管理的 Kubernetes 集群。
  76. #
  77. # 这个配置文件可以用于生成 Kubernetes 相关的证书,以确保集群中的通信安全性。
  78. # 生成一个根证书 ,多写了一些IP作为预留IP,为将来添加node做准备
  79. # 10.96.0.1是service网段的第一个地址,需要计算,192.168.1.36为高可用vip地址
  80. # 若没有IPv6 可删除可保留
  81. cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=ca-config.json -hostname=10.96.0.1,192.168.1.36,127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster,kubernetes.default.svc.cluster.local,x.oiox.cn,k.oiox.cn,l.oiox.cn,o.oiox.cn,192.168.1.31,192.168.1.32,192.168.1.33,192.168.1.34,192.168.1.35,192.168.1.36,192.168.0.37,192.168.0.38,192.168.0.39,192.168.1.70,fc00:43f4:1eea:1::10,fc00:43f4:1eea:1::20,fc00:43f4:1eea:1::30,fc00:43f4:1eea:1::40,fc00:43f4:1eea:1::50,fc00:43f4:1eea:1::60,fc00:43f4:1eea:1::70,fc00:43f4:1eea:1::80,fc00:43f4:1eea:1::90,fc00:43f4:1eea:1::100,::1 -profile=kubernetes apiserver-csr.json | cfssljson -bare /etc/kubernetes/pki/apiserver
  82. # 这个命令是使用cfssl工具生成Kubernetes API Server的证书。
  83. #
  84. # 命令的参数解释如下:
  85. # - `-ca=/etc/kubernetes/pki/ca.pem`:指定证书的颁发机构(CA)文件路径。
  86. # - `-ca-key=/etc/kubernetes/pki/ca-key.pem`:指定证书的颁发机构(CA)私钥文件路径。
  87. # - `-config=ca-config.json`:指定证书生成的配置文件路径,配置文件中包含了证书的有效期、加密算法等信息。
  88. # - `-hostname=10.96.0.1,192.168.1.36,127.0.0.1,fc00:43f4:1eea:1::10`:指定证书的主机名或IP地址列表。
  89. # - `-profile=kubernetes`:指定证书生成的配置文件中的配置文件名。
  90. # - `apiserver-csr.json`:API Server的证书签名请求配置文件路径。
  91. # - `| cfssljson -bare /etc/kubernetes/pki/apiserver`:通过管道将生成的证书输出到cfssljson工具,将其转换为PEM编码格式,并保存到 `/etc/kubernetes/pki/apiserver.pem` 和 `/etc/kubernetes/pki/apiserver-key.pem` 文件中。
  92. #
  93. # 最终,这个命令将会生成API Server的证书和私钥,并保存到指定的文件中。

3.2.3 生成apiserver聚合证书

  1. cat > front-proxy-ca-csr.json << EOF
  2. {
  3. "CN": "kubernetes",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "ca": {
  9. "expiry": "876000h"
  10. }
  11. }
  12. EOF
  13. # 这个JSON文件表示了生成一个名为"kubernetes"的证书的配置信息。这个证书是用来进行Kubernetes集群的身份验证和安全通信。
  14. #
  15. # 配置信息包括以下几个部分:
  16. #
  17. # 1. "CN": "kubernetes":这表示了证书的通用名称(Common Name),也就是证书所代表的实体的名称。在这里,证书的通用名称被设置为"kubernetes",表示这个证书是用来代表Kubernetes集群。
  18. #
  19. # 2. "key":这是用来生成证书的密钥相关的配置。在这里,配置使用了RSA算法,并且设置了密钥的大小为2048位。
  20. #
  21. # 3. "ca":这个字段指定了证书的颁发机构(Certificate Authority)相关的配置。在这里,配置指定了证书的有效期为876000小时,即100年。这意味着该证书在100年内将被视为有效,过期后需要重新生成。
  22. #
  23. # 总之,这个JSON文件中的配置信息描述了如何生成一个用于Kubernetes集群的证书,包括证书的通用名称、密钥算法和大小以及证书的有效期。
  24. cfssl gencert -initca front-proxy-ca-csr.json | cfssljson -bare /etc/kubernetes/pki/front-proxy-ca
  25. # 具体的解释如下:
  26. #
  27. # cfssl是一个用于生成TLS/SSL证书的工具,它支持PKI、JSON格式配置文件以及与许多其他集成工具的配合使用。
  28. #
  29. # gencert参数表示生成证书的操作。-initca参数表示初始化一个CA(证书颁发机构)。CA是用于签发其他证书的根证书。front-proxy-ca-csr.json是一个JSON格式的配置文件,其中包含了CA的详细信息,如私钥、公钥、有效期等。这个文件提供了生成CA证书所需的信息。
  30. #
  31. # | 符号表示将上一个命令的输出作为下一个命令的输入。
  32. #
  33. # cfssljson是cfssl工具的一个子命令,用于格式化cfssl生成的JSON数据。 -bare参数表示直接输出裸证书,即只生成证书文件,不包含其他格式的文件。/etc/kubernetes/pki/front-proxy-ca是指定生成的证书文件的路径和名称。
  34. #
  35. # 所以,这条命令的含义是使用cfssl工具根据配置文件ca-csr.json生成一个CA证书,并将证书文件保存在/etc/kubernetes/pki/front-proxy-ca路径下。
  36. cat > front-proxy-client-csr.json << EOF
  37. {
  38. "CN": "front-proxy-client",
  39. "key": {
  40. "algo": "rsa",
  41. "size": 2048
  42. }
  43. }
  44. EOF
  45. # 这是一个JSON格式的配置文件,用于描述一个名为"front-proxy-client"的配置。配置包括两个字段:CN和key。
  46. #
  47. # - CN(Common Name)字段表示证书的通用名称,这里为"front-proxy-client"。
  48. # - key字段描述了密钥的算法和大小。"algo"表示使用RSA算法,"size"表示密钥大小为2048位。
  49. #
  50. # 该配置文件用于生成一个SSL证书,用于在前端代理客户端进行认证和数据传输的加密。这个证书中的通用名称是"front-proxy-client",使用RSA算法生成,密钥大小为2048位。
  51. cfssl gencert -ca=/etc/kubernetes/pki/front-proxy-ca.pem -ca-key=/etc/kubernetes/pki/front-proxy-ca-key.pem -config=ca-config.json -profile=kubernetes front-proxy-client-csr.json | cfssljson -bare /etc/kubernetes/pki/front-proxy-client
  52. # 这个命令使用cfssl工具生成一个用于Kubernetes的front-proxy-client证书。
  53. #
  54. # 主要参数解释如下:
  55. # - `-ca=/etc/kubernetes/pki/front-proxy-ca.pem`: 指定用于签署证书的根证书文件路径。
  56. # - `-ca-key=/etc/kubernetes/pki/front-proxy-ca-key.pem`: 指定用于签署证书的根证书的私钥文件路径。
  57. # - `-config=ca-config.json`: 指定用于配置证书签署的配置文件路径。该配置文件描述了证书生成的一些规则,如加密算法和有效期等。
  58. # - `-profile=kubernetes`: 指定生成证书时使用的配置文件中定义的profile,其中包含了一些默认的参数。
  59. # - `front-proxy-client-csr.json`: 指定用于生成证书的CSR文件路径,该文件包含了证书请求的相关信息。
  60. # - `| cfssljson -bare /etc/kubernetes/pki/front-proxy-client`: 通过管道将生成的证书输出到cfssljson工具进行解析,并通过`-bare`参数将证书和私钥分别保存到指定路径。
  61. #
  62. # 这个命令的作用是根据提供的CSR文件和配置信息,使用指定的根证书和私钥生成一个前端代理客户端的证书,并将证书和私钥分别保存到`/etc/kubernetes/pki/front-proxy-client.pem`和`/etc/kubernetes/pki/front-proxy-client-key.pem`文件中。

3.2.4 生成controller-manage的证书

在《5.高可用配置》选择使用那种高可用方案
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443
若使用 nginx方案,那么为 --server=https://127.0.0.1:8443

  1. cat > manager-csr.json << EOF
  2. {
  3. "CN": "system:kube-controller-manager",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "Beijing",
  12. "L": "Beijing",
  13. "O": "system:kube-controller-manager",
  14. "OU": "Kubernetes-manual"
  15. }
  16. ]
  17. }
  18. EOF
  19. # 这是一个用于生成密钥对(公钥和私钥)的JSON配置文件。下面是针对该文件中每个字段的详细解释:
  20. #
  21. # - "CN": 值为"system:kube-controller-manager",代表通用名称(Common Name),是此密钥对的主题(subject)。
  22. # - "key": 这个字段用来定义密钥算法和大小。
  23. # - "algo": 值为"rsa",表示使用RSA算法。
  24. # - "size": 值为2048,表示生成的密钥大小为2048位。
  25. # - "names": 这个字段用来定义密钥对的各个名称字段。
  26. # - "C": 值为"CN",表示国家(Country)名称是"CN"(中国)。
  27. # - "ST": 值为"Beijing",表示省/州(State/Province)名称是"Beijing"(北京)。
  28. # - "L": 值为"Beijing",表示城市(Locality)名称是"Beijing"(北京)。
  29. # - "O": 值为"system:kube-controller-manager",表示组织(Organization)名称是"system:kube-controller-manager"。
  30. # - "OU": 值为"Kubernetes-manual",表示组织单位(Organizational Unit)名称是"Kubernetes-manual"。
  31. #
  32. # 这个JSON配置文件基本上是告诉生成密钥对的工具,生成一个带有特定名称和属性的密钥对。
  33. cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=ca-config.json -profile=kubernetes manager-csr.json | cfssljson -bare /etc/kubernetes/pki/controller-manager
  34. # 这是一个命令行操作,使用cfssl工具生成证书。
  35. #
  36. # 1. `cfssl gencert` 是cfssl工具的命令,用于生成证书。
  37. # 2. `-ca` 指定根证书的路径和文件名,这里是`/etc/kubernetes/pki/ca.pem`。
  38. # 3. `-ca-key` 指定根证书的私钥的路径和文件名,这里是`/etc/kubernetes/pki/ca-key.pem`。
  39. # 4. `-config` 指定配置文件的路径和文件名,这里是`ca-config.json`。
  40. # 5. `-profile` 指定证书使用的配置文件中的配置模板,这里是`kubernetes`。
  41. # 6. `manager-csr.json` 是证书签发请求的配置文件,用于生成证书签发请求。
  42. # 7. `|` 管道操作符,将前一条命令的输出作为后一条命令的输入。
  43. # 8. `cfssljson -bare` 是 cfssl 工具的命令,作用是将证书签发请求的输出转换为PKCS#1、PKCS#8和x509 PEM文件。
  44. # 9. `/etc/kubernetes/pki/controller-manager` 是转换后的 PEM 文件的存储位置和文件名。
  45. #
  46. # 这个命令的作用是根据根证书和私钥、配置文件以及证书签发请求的配置文件,生成经过签发的控制器管理器证书和私钥,并将转换后的 PEM 文件保存到指定的位置。
  47. # 设置一个集群项
  48. # 在《5.高可用配置》选择使用那种高可用方案
  49. # 若使用 haproxy、keepalived 那么为 `--server=https://192.168.1.36:9443`
  50. # 若使用 nginx方案,那么为 `--server=https://127.0.0.1:8443`
  51. kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:8443 --kubeconfig=/etc/kubernetes/controller-manager.kubeconfig
  52. # kubectl config set-cluster命令用于配置集群信息。
  53. # --certificate-authority选项指定了集群的证书颁发机构(CA)的路径,这个CA会验证kube-apiserver提供的证书是否合法。
  54. # --embed-certs选项用于将证书嵌入到生成的kubeconfig文件中,这样就不需要在kubeconfig文件中单独指定证书文件路径。
  55. # --server选项指定了kube-apiserver的地址,这里使用的是127.0.0.1:8443,表示使用本地主机上的kube-apiserver,默认端口为8443。
  56. # --kubeconfig选项指定了生成的kubeconfig文件的路径和名称,这里指定为/etc/kubernetes/controller-manager.kubeconfig。
  57. # 综上所述,kubectl config set-cluster命令的作用是在kubeconfig文件中设置集群信息,包括证书颁发机构、证书、kube-apiserver地址等。
  58. # 设置一个环境项,一个上下文
  59. kubectl config set-context system:kube-controller-manager@kubernetes --cluster=kubernetes --user=system:kube-controller-manager --kubeconfig=/etc/kubernetes/controller-manager.kubeconfig
  60. # 这个命令用于配置 Kubernetes 控制器管理器的上下文信息。下面是各个参数的详细解释:
  61. # 1. `kubectl config set-context system:kube-controller-manager@kubernetes`: 设置上下文的名称为 `system:kube-controller-manager@kubernetes`,这是一个标识符,用于唯一标识该上下文。
  62. # 2. `--cluster=kubernetes`: 指定集群的名称为 `kubernetes`,这是一个现有集群的标识符,表示要管理的 Kubernetes 集群。
  63. # 3. `--user=system:kube-controller-manager`: 指定使用的用户身份为 `system:kube-controller-manager`。这是一个特殊的用户身份,具有控制 Kubernetes 控制器管理器的权限。
  64. # 4. `--kubeconfig=/etc/kubernetes/controller-manager.kubeconfig`: 指定 kubeconfig 文件的路径为 `/etc/kubernetes/controller-manager.kubeconfig`。kubeconfig 文件是一个用于管理 Kubernetes 配置的文件,包含了集群、用户和上下文的相关信息。
  65. # 通过运行这个命令,可以将这些配置信息保存到 `/etc/kubernetes/controller-manager.kubeconfig` 文件中,以便在后续的操作中使用。
  66. # 设置一个用户项
  67. kubectl config set-credentials system:kube-controller-manager --client-certificate=/etc/kubernetes/pki/controller-manager.pem --client-key=/etc/kubernetes/pki/controller-manager-key.pem --embed-certs=true --kubeconfig=/etc/kubernetes/controller-manager.kubeconfig
  68. # 上述命令是用于设置 Kubernetes 的 controller-manager 组件的客户端凭据。下面是每个参数的详细解释:
  69. #
  70. # - `kubectl config`: 是使用 kubectl 命令行工具的配置子命令。
  71. # - `set-credentials`: 是定义一个新的用户凭据配置的子命令。
  72. # - `system:kube-controller-manager`: 是设置用户凭据的名称,`system:` 是 Kubernetes API Server 内置的身份验证器使用的用户标识符前缀,它表示是一个系统用户,在本例中是 kube-controller-manager 组件使用的身份。
  73. # - `--client-certificate=/etc/kubernetes/pki/controller-manager.pem`: 指定 controller-manager.pem 客户端证书的路径。
  74. # - `--client-key=/etc/kubernetes/pki/controller-manager-key.pem`: 指定 controller-manager-key.pem 客户端私钥的路径。
  75. # - `--embed-certs=true`: 表示将证书和私钥直接嵌入到生成的 kubeconfig 文件中,而不是通过引用外部文件。
  76. # - `--kubeconfig=/etc/kubernetes/controller-manager.kubeconfig`: 指定生成的 kubeconfig 文件的路径和文件名,即 controller-manager.kubeconfig。
  77. #
  78. # 通过运行上述命令,将根据提供的证书和私钥信息,为 kube-controller-manager 创建一个 kubeconfig 文件,以便后续使用该文件进行身份验证和访问 Kubernetes API。
  79. # 设置默认环境
  80. kubectl config use-context system:kube-controller-manager@kubernetes --kubeconfig=/etc/kubernetes/controller-manager.kubeconfig
  81. # 这个命令是用来指定kubectl使用指定的上下文环境来执行操作。上下文环境是kubectl用来确定要连接到哪个Kubernetes集群以及使用哪个身份验证信息的配置。
  82. #
  83. # 在这个命令中,`kubectl config use-context`是用来设置当前上下文环境的命令。 `system:kube-controller-manager@kubernetes`是指定的上下文名称,它告诉kubectl要使用的Kubernetes集群和身份验证信息。
  84. # `--kubeconfig=/etc/kubernetes/controller-manager.kubeconfig`是用来指定使用的kubeconfig文件的路径。kubeconfig文件是存储集群连接和身份验证信息的配置文件。
  85. # 通过执行这个命令,kubectl将使用指定的上下文来执行后续的操作,包括部署和管理Kubernetes资源。

3.2.5 生成kube-scheduler的证书

  1. cat > scheduler-csr.json << EOF
  2. {
  3. "CN": "system:kube-scheduler",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "Beijing",
  12. "L": "Beijing",
  13. "O": "system:kube-scheduler",
  14. "OU": "Kubernetes-manual"
  15. }
  16. ]
  17. }
  18. EOF
  19. # 这个命令是用来创建一个叫做scheduler-csr.json的文件,并将其中的内容赋值给该文件。
  20. #
  21. # 文件内容是一个JSON格式的文本,包含了一个描述证书请求的结构。
  22. #
  23. # 具体内容如下:
  24. #
  25. # - "CN": "system:kube-scheduler":Common Name字段,表示该证书的名称为system:kube-scheduler。
  26. # - "key": {"algo": "rsa", "size": 2048}:key字段指定生成证书时使用的加密算法是RSA,并且密钥的长度为2048位。
  27. # - "names": [...]:names字段定义了证书中的另外一些标识信息。
  28. # - "C": "CN":Country字段,表示国家/地区为中国。
  29. # - "ST": "Beijing":State字段,表示省/市为北京。
  30. # - "L": "Beijing":Locality字段,表示所在城市为北京。
  31. # - "O": "system:kube-scheduler":Organization字段,表示组织为system:kube-scheduler。
  32. # - "OU": "Kubernetes-manual":Organizational Unit字段,表示组织单元为Kubernetes-manual。
  33. #
  34. # 而EOF是一个占位符,用于标记开始和结束的位置。在开始的EOF之后到结束的EOF之间的内容将会被写入到scheduler-csr.json文件中。
  35. #
  36. # 总体来说,这个命令用于生成一个描述kube-scheduler证书请求的JSON文件。
  37. cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=ca-config.json -profile=kubernetes scheduler-csr.json | cfssljson -bare /etc/kubernetes/pki/scheduler
  38. # 上述命令是使用cfssl工具生成Kubernetes Scheduler的证书。
  39. #
  40. # 具体解释如下:
  41. #
  42. # 1. `cfssl gencert`:使用cfssl工具生成证书。
  43. # 2. `-ca=/etc/kubernetes/pki/ca.pem`:指定根证书文件的路径。在这里,是指定根证书的路径为`/etc/kubernetes/pki/ca.pem`。
  44. # 3. `-ca-key=/etc/kubernetes/pki/ca-key.pem`:指定根证书私钥文件的路径。在这里,是指定根证书私钥的路径为`/etc/kubernetes/pki/ca-key.pem`。
  45. # 4. `-config=ca-config.json`:指定证书配置文件的路径。在这里,是指定证书配置文件的路径为`ca-config.json`。
  46. # 5. `-profile=kubernetes`:指定证书的配置文件中的一个配置文件模板。在这里,是指定配置文件中的`kubernetes`配置模板。
  47. # 6. `scheduler-csr.json`:指定Scheduler的证书签名请求文件(CSR)的路径。在这里,是指定请求文件的路径为`scheduler-csr.json`。
  48. # 7. `|`(管道符号):将前一个命令的输出作为下一个命令的输入。
  49. # 8. `cfssljson`:将cfssl工具生成的证书签名请求(CSR)进行解析。
  50. # 9. `-bare /etc/kubernetes/pki/scheduler`:指定输出路径和前缀。在这里,是将解析的证书签名请求生成以下文件:`/etc/kubernetes/pki/scheduler.pem`(包含了证书)、`/etc/kubernetes/pki/scheduler-key.pem`(包含了私钥)。
  51. #
  52. # 总结来说,这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。
  53. # 在《5.高可用配置》选择使用那种高可用方案
  54. # 若使用 haproxy、keepalived 那么为 `--server=https://192.168.1.36:9443`
  55. # 若使用 nginx方案,那么为 `--server=https://127.0.0.1:8443`
  56. kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:8443 --kubeconfig=/etc/kubernetes/scheduler.kubeconfig
  57. # 该命令用于配置一个名为"kubernetes"的集群,并将其应用到/etc/kubernetes/scheduler.kubeconfig文件中。
  58. #
  59. # 该命令的解释如下:
  60. # - `kubectl config set-cluster kubernetes`: 设置一个集群并命名为"kubernetes"。
  61. # - `--certificate-authority=/etc/kubernetes/pki/ca.pem`: 指定集群使用的证书授权机构的路径。
  62. # - `--embed-certs=true`: 该标志指示将证书嵌入到生成的kubeconfig文件中。
  63. # - `--server=https://127.0.0.1:8443`: 指定集群的 API server 位置。
  64. # - `--kubeconfig=/etc/kubernetes/scheduler.kubeconfig`: 指定要保存 kubeconfig 文件的路径和名称。
  65. kubectl config set-credentials system:kube-scheduler --client-certificate=/etc/kubernetes/pki/scheduler.pem --client-key=/etc/kubernetes/pki/scheduler-key.pem --embed-certs=true --kubeconfig=/etc/kubernetes/scheduler.kubeconfig
  66. # 这段命令是用于设置 kube-scheduler 组件的身份验证凭据,并生成相应的 kubeconfig 文件。
  67. #
  68. # 解释每个选项的含义如下:
  69. # - `kubectl config set-credentials system:kube-scheduler`:设置 `system:kube-scheduler` 用户的身份验证凭据。
  70. # - `--client-certificate=/etc/kubernetes/pki/scheduler.pem`:指定一个客户端证书文件,用于基于证书的身份验证。在这种情况下,指定了 kube-scheduler 组件的证书文件路径。
  71. # - `--client-key=/etc/kubernetes/pki/scheduler-key.pem`:指定与客户端证书相对应的客户端私钥文件。
  72. # - `--embed-certs=true`:将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。
  73. # - `--kubeconfig=/etc/kubernetes/scheduler.kubeconfig`:指定生成的 kubeconfig 文件的路径和名称。
  74. #
  75. # 该命令的目的是为 kube-scheduler 组件生成一个 kubeconfig 文件,以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件,包括服务器地址、证书和秘钥等。
  76. kubectl config set-context system:kube-scheduler@kubernetes --cluster=kubernetes --user=system:kube-scheduler --kubeconfig=/etc/kubernetes/scheduler.kubeconfig
  77. # 该命令用于设置一个名为"system:kube-scheduler@kubernetes"的上下文,具体配置如下:
  78. #
  79. # 1. --cluster=kubernetes: 指定集群的名称为"kubernetes",这个集群是在当前的kubeconfig文件中已经定义好的。
  80. # 2. --user=system:kube-scheduler: 指定用户的名称为"system:kube-scheduler",这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权kube-scheduler组件访问Kubernetes集群的权限。
  81. # 3. --kubeconfig=/etc/kubernetes/scheduler.kubeconfig: 指定kubeconfig文件的路径为"/etc/kubernetes/scheduler.kubeconfig",这个文件将被用来保存上下文的配置信息。
  82. #
  83. # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中,以便后续使用该文件进行认证和授权访问Kubernetes集群。
  84. kubectl config use-context system:kube-scheduler@kubernetes --kubeconfig=/etc/kubernetes/scheduler.kubeconfig
  85. # 上述命令是使用`kubectl`命令来配置Kubernetes集群中的调度器组件。
  86. #
  87. # `kubectl config use-context`命令用于切换`kubectl`当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合,用于确定`kubectl`的连接目标。下面解释这个命令的不同部分:
  88. #
  89. # - `system:kube-scheduler@kubernetes`是一个上下文名称。它指定了使用`kube-scheduler`用户和`kubernetes`命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。
  90. #
  91. # - `--kubeconfig=/etc/kubernetes/scheduler.kubeconfig`用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。
  92. #
  93. # 通过运行以上命令,`kubectl`将使用指定的上下文和配置文件,以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。

3.2.6 生成admin的证书配置

  1. cat > admin-csr.json << EOF
  2. {
  3. "CN": "admin",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "Beijing",
  12. "L": "Beijing",
  13. "O": "system:masters",
  14. "OU": "Kubernetes-manual"
  15. }
  16. ]
  17. }
  18. EOF
  19. # 这段代码是一个JSON格式的配置文件,用于创建和配置一个名为"admin"的Kubernetes凭证。
  20. #
  21. # 这个凭证包含以下字段:
  22. #
  23. # - "CN": "admin": 这是凭证的通用名称,表示这是一个管理员凭证。
  24. # - "key": 这是一个包含证书密钥相关信息的对象。
  25. # - "algo": "rsa":这是使用的加密算法类型,这里是RSA加密算法。
  26. # - "size": 2048:这是密钥的大小,这里是2048位。
  27. # - "names": 这是一个包含证书名称信息的数组。
  28. # - "C": "CN":这是证书的国家/地区字段,这里是中国。
  29. # - "ST": "Beijing":这是证书的省/州字段,这里是北京。
  30. # - "L": "Beijing":这是证书的城市字段,这里是北京。
  31. # - "O": "system:masters":这是证书的组织字段,这里是system:masters,表示系统的管理员组。
  32. # - "OU": "Kubernetes-manual":这是证书的部门字段,这里是Kubernetes-manual。
  33. #
  34. # 通过这个配置文件创建的凭证将具有管理员权限,并且可以用于管理Kubernetes集群。
  35. cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare /etc/kubernetes/pki/admin
  36. # 上述命令是使用cfssl工具生成Kubernetes admin的证书。
  37. #
  38. # 具体解释如下:
  39. #
  40. # 1. `cfssl gencert`:使用cfssl工具生成证书。
  41. # 2. `-ca=/etc/kubernetes/pki/ca.pem`:指定根证书文件的路径。在这里,是指定根证书的路径为`/etc/kubernetes/pki/ca.pem`。
  42. # 3. `-ca-key=/etc/kubernetes/pki/ca-key.pem`:指定根证书私钥文件的路径。在这里,是指定根证书私钥的路径为`/etc/kubernetes/pki/ca-key.pem`。
  43. # 4. `-config=ca-config.json`:指定证书配置文件的路径。在这里,是指定证书配置文件的路径为`ca-config.json`。
  44. # 5. `-profile=kubernetes`:指定证书的配置文件中的一个配置文件模板。在这里,是指定配置文件中的`kubernetes`配置模板。
  45. # 6. `admin-csr.json`:指定admin的证书签名请求文件(CSR)的路径。在这里,是指定请求文件的路径为`admin-csr.json`。
  46. # 7. `|`(管道符号):将前一个命令的输出作为下一个命令的输入。
  47. # 8. `cfssljson`:将cfssl工具生成的证书签名请求(CSR)进行解析。
  48. # 9. `-bare /etc/kubernetes/pki/admin`:指定输出路径和前缀。在这里,是将解析的证书签名请求生成以下文件:`/etc/kubernetes/pki/admin.pem`(包含了证书)、`/etc/kubernetes/pki/admin-key.pem`(包含了私钥)。
  49. #
  50. # 总结来说,这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。
  51. # 在《5.高可用配置》选择使用那种高可用方案
  52. # 若使用 haproxy、keepalived 那么为 `--server=https://192.168.1.36:9443`
  53. # 若使用 nginx方案,那么为 `--server=https://127.0.0.1:8443`
  54. kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:8443 --kubeconfig=/etc/kubernetes/admin.kubeconfig
  55. # 该命令用于配置一个名为"kubernetes"的集群,并将其应用到/etc/kubernetes/scheduler.kubeconfig文件中。
  56. #
  57. # 该命令的解释如下:
  58. # - `kubectl config set-cluster kubernetes`: 设置一个集群并命名为"kubernetes"。
  59. # - `--certificate-authority=/etc/kubernetes/pki/ca.pem`: 指定集群使用的证书授权机构的路径。
  60. # - `--embed-certs=true`: 该标志指示将证书嵌入到生成的kubeconfig文件中。
  61. # - `--server=https://127.0.0.1:8443`: 指定集群的 API server 位置。
  62. # - `--kubeconfig=/etc/kubernetes/admin.kubeconfig`: 指定要保存 kubeconfig 文件的路径和名称。
  63. kubectl config set-credentials kubernetes-admin --client-certificate=/etc/kubernetes/pki/admin.pem --client-key=/etc/kubernetes/pki/admin-key.pem --embed-certs=true --kubeconfig=/etc/kubernetes/admin.kubeconfig
  64. # 这段命令是用于设置 kubernetes-admin 组件的身份验证凭据,并生成相应的 kubeconfig 文件。
  65. #
  66. # 解释每个选项的含义如下:
  67. # - `kubectl config set-credentials kubernetes-admin`:设置 `kubernetes-admin` 用户的身份验证凭据。
  68. # - `--client-certificate=/etc/kubernetes/pki/admin.pem`:指定一个客户端证书文件,用于基于证书的身份验证。在这种情况下,指定了 admin 组件的证书文件路径。
  69. # - `--client-key=/etc/kubernetes/pki/admin-key.pem`:指定与客户端证书相对应的客户端私钥文件。
  70. # - `--embed-certs=true`:将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。
  71. # - `--kubeconfig=/etc/kubernetes/admin.kubeconfig`:指定生成的 kubeconfig 文件的路径和名称。
  72. #
  73. # 该命令的目的是为 admin 组件生成一个 kubeconfig 文件,以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件,包括服务器地址、证书和秘钥等。
  74. kubectl config set-context kubernetes-admin@kubernetes --cluster=kubernetes --user=kubernetes-admin --kubeconfig=/etc/kubernetes/admin.kubeconfig
  75. # 该命令用于设置一个名为"kubernetes-admin@kubernetes"的上下文,具体配置如下:
  76. #
  77. # 1. --cluster=kubernetes: 指定集群的名称为"kubernetes",这个集群是在当前的kubeconfig文件中已经定义好的。
  78. # 2. --user=kubernetes-admin: 指定用户的名称为"kubernetes-admin",这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权admin组件访问Kubernetes集群的权限。
  79. # 3. --kubeconfig=/etc/kubernetes/admin.kubeconfig: 指定kubeconfig文件的路径为"/etc/kubernetes/admin.kubeconfig",这个文件将被用来保存上下文的配置信息。
  80. #
  81. # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中,以便后续使用该文件进行认证和授权访问Kubernetes集群。
  82. kubectl config use-context kubernetes-admin@kubernetes --kubeconfig=/etc/kubernetes/admin.kubeconfig
  83. # 上述命令是使用`kubectl`命令来配置Kubernetes集群中的调度器组件。
  84. #
  85. # `kubectl config use-context`命令用于切换`kubectl`当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合,用于确定`kubectl`的连接目标。下面解释这个命令的不同部分:
  86. #
  87. # - `kubernetes-admin@kubernetes`是一个上下文名称。它指定了使用`kubernetes-admin`用户和`kubernetes`命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。
  88. #
  89. # - `--kubeconfig=/etc/kubernetes/admin.kubeconfig`用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。
  90. #
  91. # 通过运行以上命令,`kubectl`将使用指定的上下文和配置文件,以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。

3.2.7 创建kube-proxy证书

在《5.高可用配置》选择使用那种高可用方案
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443
若使用 nginx方案,那么为 --server=https://127.0.0.1:8443

  1. cat > kube-proxy-csr.json << EOF
  2. {
  3. "CN": "system:kube-proxy",
  4. "key": {
  5. "algo": "rsa",
  6. "size": 2048
  7. },
  8. "names": [
  9. {
  10. "C": "CN",
  11. "ST": "Beijing",
  12. "L": "Beijing",
  13. "O": "system:kube-proxy",
  14. "OU": "Kubernetes-manual"
  15. }
  16. ]
  17. }
  18. EOF
  19. # 这段代码是一个JSON格式的配置文件,用于创建和配置一个名为"kube-proxy-csr"的Kubernetes凭证。
  20. #
  21. # 这个凭证包含以下字段:
  22. #
  23. # - "CN": "system:kube-proxy": 这是凭证的通用名称,表示这是一个管理员凭证。
  24. # - "key": 这是一个包含证书密钥相关信息的对象。
  25. # - "algo": "rsa":这是使用的加密算法类型,这里是RSA加密算法。
  26. # - "size": 2048:这是密钥的大小,这里是2048位。
  27. # - "names": 这是一个包含证书名称信息的数组。
  28. # - "C": "CN":这是证书的国家/地区字段,这里是中国。
  29. # - "ST": "Beijing":这是证书的省/州字段,这里是北京。
  30. # - "L": "Beijing":这是证书的城市字段,这里是北京。
  31. # - "O": "system:kube-proxy":这是证书的组织字段,这里是system:kube-proxy。
  32. # - "OU": "Kubernetes-manual":这是证书的部门字段,这里是Kubernetes-manual。
  33. #
  34. # 通过这个配置文件创建的凭证将具有管理员权限,并且可以用于管理Kubernetes集群。
  35. cfssl gencert -ca=/etc/kubernetes/pki/ca.pem -ca-key=/etc/kubernetes/pki/ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare /etc/kubernetes/pki/kube-proxy
  36. # 上述命令是使用cfssl工具生成Kubernetes admin的证书。
  37. #
  38. # 具体解释如下:
  39. #
  40. # 1. `cfssl gencert`:使用cfssl工具生成证书。
  41. # 2. `-ca=/etc/kubernetes/pki/ca.pem`:指定根证书文件的路径。在这里,是指定根证书的路径为`/etc/kubernetes/pki/ca.pem`。
  42. # 3. `-ca-key=/etc/kubernetes/pki/ca-key.pem`:指定根证书私钥文件的路径。在这里,是指定根证书私钥的路径为`/etc/kubernetes/pki/ca-key.pem`。
  43. # 4. `-config=ca-config.json`:指定证书配置文件的路径。在这里,是指定证书配置文件的路径为`ca-config.json`。
  44. # 5. `-profile=kubernetes`:指定证书的配置文件中的一个配置文件模板。在这里,是指定配置文件中的`kubernetes`配置模板。
  45. # 6. `kube-proxy-csr.json`:指定admin的证书签名请求文件(CSR)的路径。在这里,是指定请求文件的路径为`kube-proxy-csr.json`。
  46. # 7. `|`(管道符号):将前一个命令的输出作为下一个命令的输入。
  47. # 8. `cfssljson`:将cfssl工具生成的证书签名请求(CSR)进行解析。
  48. # 9. `-bare /etc/kubernetes/pki/kube-proxy`:指定输出路径和前缀。在这里,是将解析的证书签名请求生成以下文件:`/etc/kubernetes/pki/kube-proxy.pem`(包含了证书)、`/etc/kubernetes/pki/kube-proxy-key.pem`(包含了私钥)。
  49. #
  50. # 总结来说,这个命令的目的是根据根证书、根证书私钥、证书配置文件、CSR文件等生成Kubernetes Scheduler的证书和私钥文件。
  51. # 在《5.高可用配置》选择使用那种高可用方案
  52. # 若使用 haproxy、keepalived 那么为 `--server=https://192.168.1.36:9443`
  53. # 若使用 nginx方案,那么为 `--server=https://127.0.0.1:8443`
  54. kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:8443 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig
  55. # 该命令用于配置一个名为"kubernetes"的集群,并将其应用到/etc/kubernetes/kube-proxy.kubeconfig文件中。
  56. #
  57. # 该命令的解释如下:
  58. # - `kubectl config set-cluster kubernetes`: 设置一个集群并命名为"kubernetes"。
  59. # - `--certificate-authority=/etc/kubernetes/pki/ca.pem`: 指定集群使用的证书授权机构的路径。
  60. # - `--embed-certs=true`: 该标志指示将证书嵌入到生成的kubeconfig文件中。
  61. # - `--server=https://127.0.0.1:8443`: 指定集群的 API server 位置。
  62. # - `--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig`: 指定要保存 kubeconfig 文件的路径和名称。
  63. kubectl config set-credentials kube-proxy --client-certificate=/etc/kubernetes/pki/kube-proxy.pem --client-key=/etc/kubernetes/pki/kube-proxy-key.pem --embed-certs=true --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig
  64. # 这段命令是用于设置 kube-proxy 组件的身份验证凭据,并生成相应的 kubeconfig 文件。
  65. #
  66. # 解释每个选项的含义如下:
  67. # - `kubectl config set-credentials kube-proxy`:设置 `kube-proxy` 用户的身份验证凭据。
  68. # - `--client-certificate=/etc/kubernetes/pki/kube-proxy.pem`:指定一个客户端证书文件,用于基于证书的身份验证。在这种情况下,指定了 kube-proxy 组件的证书文件路径。
  69. # - `--client-key=/etc/kubernetes/pki/kube-proxy-key.pem`:指定与客户端证书相对应的客户端私钥文件。
  70. # - `--embed-certs=true`:将客户端证书和私钥嵌入到生成的 kubeconfig 文件中。
  71. # - `--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig`:指定生成的 kubeconfig 文件的路径和名称。
  72. #
  73. # 该命令的目的是为 kube-proxy 组件生成一个 kubeconfig 文件,以便进行身份验证和访问集群资源。kubeconfig 文件是一个包含了连接到 Kubernetes 集群所需的所有配置信息的文件,包括服务器地址、证书和秘钥等。
  74. kubectl config set-context kube-proxy@kubernetes --cluster=kubernetes --user=kube-proxy --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig
  75. # 该命令用于设置一个名为"kube-proxy@kubernetes"的上下文,具体配置如下:
  76. #
  77. # 1. --cluster=kubernetes: 指定集群的名称为"kubernetes",这个集群是在当前的kubeconfig文件中已经定义好的。
  78. # 2. --user=kube-proxy: 指定用户的名称为"kube-proxy",这个用户也是在当前的kubeconfig文件中已经定义好的。这个用户用于认证和授权kube-proxy组件访问Kubernetes集群的权限。
  79. # 3. --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig: 指定kubeconfig文件的路径为"/etc/kubernetes/kube-proxy.kubeconfig",这个文件将被用来保存上下文的配置信息。
  80. #
  81. # 这个命令的作用是将上述的配置信息保存到指定的kubeconfig文件中,以便后续使用该文件进行认证和授权访问Kubernetes集群。
  82. kubectl config use-context kube-proxy@kubernetes --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig
  83. # 上述命令是使用`kubectl`命令来配置Kubernetes集群中的调度器组件。
  84. #
  85. # `kubectl config use-context`命令用于切换`kubectl`当前使用的上下文。上下文是Kubernetes集群、用户和命名空间的组合,用于确定`kubectl`的连接目标。下面解释这个命令的不同部分:
  86. #
  87. # - `kube-proxy@kubernetes`是一个上下文名称。它指定了使用`kube-proxy`用户和`kubernetes`命名空间的系统级别上下文。系统级别上下文用于操作Kubernetes核心组件。
  88. #
  89. # - `--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig`用于指定Kubernetes配置文件的路径。Kubernetes配置文件包含连接到Kubernetes集群所需的身份验证和连接信息。
  90. #
  91. # 通过运行以上命令,`kubectl`将使用指定的上下文和配置文件,以便在以后的命令中能正确地与Kubernetes集群中的调度器组件进行交互。

3.2.8 创建ServiceAccount Key ——secret

  1. openssl genrsa -out /etc/kubernetes/pki/sa.key 2048
  2. openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub
  3. # 这两个命令是使用OpenSSL工具生成RSA密钥对。
  4. #
  5. # 命令1:openssl genrsa -out /etc/kubernetes/pki/sa.key 2048
  6. # 该命令用于生成私钥文件。具体解释如下:
  7. # - openssl:openssl命令行工具。
  8. # - genrsa:生成RSA密钥对。
  9. # - -out /etc/kubernetes/pki/sa.key:指定输出私钥文件的路径和文件名。
  10. # - 2048:指定密钥长度为2048位。
  11. #
  12. # 命令2:openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub
  13. # 该命令用于从私钥中导出公钥。具体解释如下:
  14. # - openssl:openssl命令行工具。
  15. # - rsa:与私钥相关的RSA操作。
  16. # - -in /etc/kubernetes/pki/sa.key:指定输入私钥文件的路径和文件名。
  17. # - -pubout:指定输出公钥。
  18. # - -out /etc/kubernetes/pki/sa.pub:指定输出公钥文件的路径和文件名。
  19. #
  20. # 总结:通过以上两个命令,我们可以使用OpenSSL工具生成一个RSA密钥对,并将私钥保存在/etc/kubernetes/pki/sa.key文件中,将公钥保存在/etc/kubernetes/pki/sa.pub文件中。

3.2.9 将证书发送到其他master节点

  1. #其他节点创建目录
  2. # mkdir /etc/kubernetes/pki/ -p
  3. for NODE in k8s-master02 k8s-master03; do for FILE in $(ls /etc/kubernetes/pki | grep -v etcd); do scp /etc/kubernetes/pki/${FILE} $NODE:/etc/kubernetes/pki/${FILE}; done; for FILE in admin.kubeconfig controller-manager.kubeconfig scheduler.kubeconfig; do scp /etc/kubernetes/${FILE} $NODE:/etc/kubernetes/${FILE}; done; done

3.2.10 查看证书

  1. ls /etc/kubernetes/pki/
  2. admin.csr controller-manager.csr kube-proxy.csr
  3. admin-key.pem controller-manager-key.pem kube-proxy-key.pem
  4. admin.pem controller-manager.pem kube-proxy.pem
  5. apiserver.csr front-proxy-ca.csr sa.key
  6. apiserver-key.pem front-proxy-ca-key.pem sa.pub
  7. apiserver.pem front-proxy-ca.pem scheduler.csr
  8. ca.csr front-proxy-client.csr scheduler-key.pem
  9. ca-key.pem front-proxy-client-key.pem scheduler.pem
  10. ca.pem front-proxy-client.pem
  11. # 一共26个就对了
  12. ls /etc/kubernetes/pki/ |wc -l
  13. 26

4.k8s系统组件配置

4.1.etcd配置

  1. 这个配置文件是用于 etcd 集群的配置,其中包含了一些重要的参数和选项:
  2. - `name`:指定了当前节点的名称,用于集群中区分不同的节点。
  3. - `data-dir`:指定了 etcd 数据的存储目录。
  4. - `wal-dir`:指定了 etcd 数据写入磁盘的目录。
  5. - `snapshot-count`:指定了触发快照的事务数量。
  6. - `heartbeat-interval`:指定了 etcd 集群中节点之间的心跳间隔。
  7. - `election-timeout`:指定了选举超时时间。
  8. - `quota-backend-bytes`:指定了存储的限额,0 表示无限制。
  9. - `listen-peer-urls`:指定了节点之间通信的 URL,使用 HTTPS 协议。
  10. - `listen-client-urls`:指定了客户端访问 etcd 集群的 URL,同时提供了本地访问的 URL
  11. - `max-snapshots`:指定了快照保留的数量。
  12. - `max-wals`:指定了日志保留的数量。
  13. - `initial-advertise-peer-urls`:指定了节点之间通信的初始 URL
  14. - `advertise-client-urls`:指定了客户端访问 etcd 集群的初始 URL
  15. - `discovery`:定义了 etcd 集群发现相关的选项。
  16. - `initial-cluster`:指定了 etcd 集群的初始成员。
  17. - `initial-cluster-token`:指定了集群的 token
  18. - `initial-cluster-state`:指定了集群的初始状态。
  19. - `strict-reconfig-check`:指定了严格的重新配置检查选项。
  20. - `enable-v2`:启用了 v2 API
  21. - `enable-pprof`:启用了性能分析。
  22. - `proxy`:设置了代理模式。
  23. - `client-transport-security`:客户端的传输安全配置。
  24. - `peer-transport-security`:节点之间的传输安全配置。
  25. - `debug`:是否启用调试模式。
  26. - `log-package-levels`:日志的输出级别。
  27. - `log-outputs`:指定了日志的输出类型。
  28. - `force-new-cluster`:是否强制创建一个新的集群。
  29. 这些参数和选项可以根据实际需求进行调整和配置。

4.1.1master01配置

  1. # 如果要用IPv6那么把IPv4地址修改为IPv6即可
  2. cat > /etc/etcd/etcd.config.yml << EOF
  3. name: 'k8s-master01'
  4. data-dir: /var/lib/etcd
  5. wal-dir: /var/lib/etcd/wal
  6. snapshot-count: 5000
  7. heartbeat-interval: 100
  8. election-timeout: 1000
  9. quota-backend-bytes: 0
  10. listen-peer-urls: 'https://192.168.1.31:2380'
  11. listen-client-urls: 'https://192.168.1.31:2379,http://127.0.0.1:2379'
  12. max-snapshots: 3
  13. max-wals: 5
  14. cors:
  15. initial-advertise-peer-urls: 'https://192.168.1.31:2380'
  16. advertise-client-urls: 'https://192.168.1.31:2379'
  17. discovery:
  18. discovery-fallback: 'proxy'
  19. discovery-proxy:
  20. discovery-srv:
  21. initial-cluster: 'k8s-master01=https://192.168.1.31:2380,k8s-master02=https://192.168.1.32:2380,k8s-master03=https://192.168.1.33:2380'
  22. initial-cluster-token: 'etcd-k8s-cluster'
  23. initial-cluster-state: 'new'
  24. strict-reconfig-check: false
  25. enable-v2: true
  26. enable-pprof: true
  27. proxy: 'off'
  28. proxy-failure-wait: 5000
  29. proxy-refresh-interval: 30000
  30. proxy-dial-timeout: 1000
  31. proxy-write-timeout: 5000
  32. proxy-read-timeout: 0
  33. client-transport-security:
  34. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  35. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  36. client-cert-auth: true
  37. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  38. auto-tls: true
  39. peer-transport-security:
  40. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  41. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  42. peer-client-cert-auth: true
  43. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  44. auto-tls: true
  45. debug: false
  46. log-package-levels:
  47. log-outputs: [default]
  48. force-new-cluster: false
  49. EOF

4.1.2master02配置

  1. # 如果要用IPv6那么把IPv4地址修改为IPv6即可
  2. cat > /etc/etcd/etcd.config.yml << EOF
  3. name: 'k8s-master02'
  4. data-dir: /var/lib/etcd
  5. wal-dir: /var/lib/etcd/wal
  6. snapshot-count: 5000
  7. heartbeat-interval: 100
  8. election-timeout: 1000
  9. quota-backend-bytes: 0
  10. listen-peer-urls: 'https://192.168.1.32:2380'
  11. listen-client-urls: 'https://192.168.1.32:2379,http://127.0.0.1:2379'
  12. max-snapshots: 3
  13. max-wals: 5
  14. cors:
  15. initial-advertise-peer-urls: 'https://192.168.1.32:2380'
  16. advertise-client-urls: 'https://192.168.1.32:2379'
  17. discovery:
  18. discovery-fallback: 'proxy'
  19. discovery-proxy:
  20. discovery-srv:
  21. initial-cluster: 'k8s-master01=https://192.168.1.31:2380,k8s-master02=https://192.168.1.32:2380,k8s-master03=https://192.168.1.33:2380'
  22. initial-cluster-token: 'etcd-k8s-cluster'
  23. initial-cluster-state: 'new'
  24. strict-reconfig-check: false
  25. enable-v2: true
  26. enable-pprof: true
  27. proxy: 'off'
  28. proxy-failure-wait: 5000
  29. proxy-refresh-interval: 30000
  30. proxy-dial-timeout: 1000
  31. proxy-write-timeout: 5000
  32. proxy-read-timeout: 0
  33. client-transport-security:
  34. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  35. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  36. client-cert-auth: true
  37. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  38. auto-tls: true
  39. peer-transport-security:
  40. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  41. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  42. peer-client-cert-auth: true
  43. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  44. auto-tls: true
  45. debug: false
  46. log-package-levels:
  47. log-outputs: [default]
  48. force-new-cluster: false
  49. EOF

4.1.3master03配置

  1. # 如果要用IPv6那么把IPv4地址修改为IPv6即可
  2. cat > /etc/etcd/etcd.config.yml << EOF
  3. name: 'k8s-master03'
  4. data-dir: /var/lib/etcd
  5. wal-dir: /var/lib/etcd/wal
  6. snapshot-count: 5000
  7. heartbeat-interval: 100
  8. election-timeout: 1000
  9. quota-backend-bytes: 0
  10. listen-peer-urls: 'https://192.168.1.33:2380'
  11. listen-client-urls: 'https://192.168.1.33:2379,http://127.0.0.1:2379'
  12. max-snapshots: 3
  13. max-wals: 5
  14. cors:
  15. initial-advertise-peer-urls: 'https://192.168.1.33:2380'
  16. advertise-client-urls: 'https://192.168.1.33:2379'
  17. discovery:
  18. discovery-fallback: 'proxy'
  19. discovery-proxy:
  20. discovery-srv:
  21. initial-cluster: 'k8s-master01=https://192.168.1.31:2380,k8s-master02=https://192.168.1.32:2380,k8s-master03=https://192.168.1.33:2380'
  22. initial-cluster-token: 'etcd-k8s-cluster'
  23. initial-cluster-state: 'new'
  24. strict-reconfig-check: false
  25. enable-v2: true
  26. enable-pprof: true
  27. proxy: 'off'
  28. proxy-failure-wait: 5000
  29. proxy-refresh-interval: 30000
  30. proxy-dial-timeout: 1000
  31. proxy-write-timeout: 5000
  32. proxy-read-timeout: 0
  33. client-transport-security:
  34. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  35. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  36. client-cert-auth: true
  37. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  38. auto-tls: true
  39. peer-transport-security:
  40. cert-file: '/etc/kubernetes/pki/etcd/etcd.pem'
  41. key-file: '/etc/kubernetes/pki/etcd/etcd-key.pem'
  42. peer-client-cert-auth: true
  43. trusted-ca-file: '/etc/kubernetes/pki/etcd/etcd-ca.pem'
  44. auto-tls: true
  45. debug: false
  46. log-package-levels:
  47. log-outputs: [default]
  48. force-new-cluster: false
  49. EOF

4.2.创建service(所有master节点操作)

4.2.1创建etcd.service并启动

  1. cat > /usr/lib/systemd/system/etcd.service << EOF
  2. [Unit]
  3. Description=Etcd Service
  4. Documentation=https://coreos.com/etcd/docs/latest/
  5. After=network.target
  6. [Service]
  7. Type=notify
  8. ExecStart=/usr/local/bin/etcd --config-file=/etc/etcd/etcd.config.yml
  9. Restart=on-failure
  10. RestartSec=10
  11. LimitNOFILE=65536
  12. [Install]
  13. WantedBy=multi-user.target
  14. Alias=etcd3.service
  15. EOF
  16. # 这是一个系统服务配置文件,用于启动和管理Etcd服务。
  17. #
  18. # [Unit] 部分包含了服务的一些基本信息,它定义了服务的描述和文档链接,并指定了服务应在网络连接之后启动。
  19. #
  20. # [Service] 部分定义了服务的具体配置。在这里,服务的类型被设置为notify,意味着当服务成功启动时,它将通知系统。ExecStart 指定了启动服务时要执行的命令,这里是运行 /usr/local/bin/etcd 命令并传递一个配置文件 /etc/etcd/etcd.config.yml。Restart 设置为 on-failure,意味着当服务失败时将自动重启,并且在10秒后进行重启。LimitNOFILE 指定了服务的最大文件打开数。
  21. #
  22. # [Install] 部分定义了服务的安装配置。WantedBy 指定了服务应该被启动的目标,这里是 multi-user.target,表示在系统进入多用户模式时启动。Alias 定义了一个别名,可以通过etcd3.service来引用这个服务。
  23. #
  24. # 这个配置文件描述了如何启动和管理Etcd服务,并将其安装到系统中。通过这个配置文件,可以确保Etcd服务在系统启动后自动启动,并在出现问题时进行重启。

4.2.2创建etcd证书目录

  1. mkdir /etc/kubernetes/pki/etcd
  2. ln -s /etc/etcd/ssl/* /etc/kubernetes/pki/etcd/
  3. systemctl daemon-reload
  4. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  5. systemctl enable --now etcd.service
  6. # 启用并立即启动etcd.service单元。etcd.service是etcd守护进程的systemd服务单元。
  7. systemctl restart etcd.service
  8. # 重启etcd.service单元,即重新启动etcd守护进程。
  9. systemctl status etcd.service
  10. # etcd.service单元的当前状态,包括运行状态、是否启用等信息。

4.2.3查看etcd状态

  1. # 如果要用IPv6那么把IPv4地址修改为IPv6即可
  2. export ETCDCTL_API=3
  3. etcdctl --endpoints="192.168.1.33:2379,192.168.1.32:2379,192.168.1.31:2379" --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem --cert=/etc/kubernetes/pki/etcd/etcd.pem --key=/etc/kubernetes/pki/etcd/etcd-key.pem endpoint status --write-out=table
  4. +-------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  5. | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
  6. +-------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  7. | 192.168.1.33:2379 | 8065f2e59c8d68c | 3.5.12 | 20 kB | false | false | 4 | 14 | 14 | |
  8. | 192.168.1.32:2379 | b7b7ad6bf4db3f28 | 3.5.12 | 20 kB | true | false | 4 | 14 | 14 | |
  9. | 192.168.1.31:2379 | bf047bcfe3b9bf27 | 3.5.12 | 20 kB | false | false | 4 | 14 | 14 | |
  10. +-------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  11. # 这个命令是使用etcdctl工具,用于查看指定etcd集群的健康状态。下面是每个参数的详细解释:
  12. #
  13. # - `--endpoints`:指定要连接的etcd集群节点的地址和端口。在这个例子中,指定了3个节点的地址和端口,分别是`192.168.1.33:2379,192.168.1.32:2379,192.168.1.31:2379`。
  14. # - `--cacert`:指定用于验证etcd服务器证书的CA证书的路径。在这个例子中,指定了CA证书的路径为`/etc/kubernetes/pki/etcd/etcd-ca.pem`。CA证书用于验证etcd服务器证书的有效性。
  15. # - `--cert`:指定用于与etcd服务器进行通信的客户端证书的路径。在这个例子中,指定了客户端证书的路径为`/etc/kubernetes/pki/etcd/etcd.pem`。客户端证书用于在与etcd服务器建立安全通信时进行身份验证。
  16. # - `--key`:指定与客户端证书配对的私钥的路径。在这个例子中,指定了私钥的路径为`/etc/kubernetes/pki/etcd/etcd-key.pem`。私钥用于对通信进行加密解密和签名验证。
  17. # - `endpoint status`:子命令,用于检查etcd集群节点的健康状态。
  18. # - `--write-out`:指定输出的格式。在这个例子中,指定以表格形式输出。
  19. #
  20. # 通过执行这个命令,可以获取到etcd集群节点的健康状态,并以表格形式展示。

5.高可用配置(在Master服务器上操作)

注意 5.1.1 和5.1.2 二选一即可*

选择使用那种高可用方案,同时可以俩种都选用,实现内外兼顾的效果,比如:
5.1 的 NGINX方案实现集群内的高可用
5.2 的 haproxy、keepalived 方案实现集群外访问

在《3.2.生成k8s相关证书》

若使用 nginx方案,那么为 --server=https://127.0.0.1:8443
若使用 haproxy、keepalived 那么为 --server=https://192.168.1.36:9443

5.1 NGINX高可用方案

5.1.1 进行编译

  1. # 安装编译环境
  2. yum install gcc -y
  3. # 下载解压nginx二进制文件
  4. # wget http://nginx.org/download/nginx-1.25.3.tar.gz
  5. tar xvf nginx-*.tar.gz
  6. cd nginx-*
  7. # 进行编译
  8. ./configure --with-stream --without-http --without-http_uwsgi_module --without-http_scgi_module --without-http_fastcgi_module
  9. make && make install
  10. # 拷贝编译好的nginx
  11. node='k8s-master02 k8s-master03 k8s-node01 k8s-node02'
  12. for NODE in $node; do scp -r /usr/local/nginx/ $NODE:/usr/local/nginx/; done
  13. # 这是一系列命令行指令,用于编译和安装软件。
  14. #
  15. # 1. `./configure` 是用于配置软件的命令。在这个例子中,配置的软件是一个Web服务器,指定了一些选项来启用流模块,并禁用了HTTP、uwsgi、scgi和fastcgi模块。
  16. # 2. `--with-stream` 指定启用流模块。流模块通常用于代理TCP和UDP流量。
  17. # 3. `--without-http` 指定禁用HTTP模块。这意味着编译的软件将没有HTTP服务器功能。
  18. # 4. `--without-http_uwsgi_module` 指定禁用uwsgi模块。uwsgi是一种Web服务器和应用服务器之间的通信协议。
  19. # 5. `--without-http_scgi_module` 指定禁用scgi模块。scgi是一种用于将Web服务器请求传递到应用服务器的协议。
  20. # 6. `--without-http_fastcgi_module` 指定禁用fastcgi模块。fastcgi是一种用于在Web服务器和应用服务器之间交换数据的协议。
  21. # 7. `make` 是用于编译软件的命令。该命令将根据之前的配置生成可执行文件。
  22. # 8. `make install` 用于安装软件。该命令将生成的可执行文件和其他必要文件复制到系统的适当位置,以便可以使用该软件。
  23. #
  24. # 总之,这个命令序列用于编译一个配置了特定选项的Web服务器,并将其安装到系统中。

5.1.2 写入启动配置

在所有主机上执行

  1. # 写入nginx配置文件
  2. cat > /usr/local/nginx/conf/kube-nginx.conf <<EOF
  3. worker_processes 1;
  4. events {
  5. worker_connections 1024;
  6. }
  7. stream {
  8. upstream backend {
  9. least_conn;
  10. hash $remote_addr consistent;
  11. server 192.168.1.31:6443 max_fails=3 fail_timeout=30s;
  12. server 192.168.1.32:6443 max_fails=3 fail_timeout=30s;
  13. server 192.168.1.33:6443 max_fails=3 fail_timeout=30s;
  14. }
  15. server {
  16. listen 127.0.0.1:8443;
  17. proxy_connect_timeout 1s;
  18. proxy_pass backend;
  19. }
  20. }
  21. EOF
  22. # 这段配置是一个nginx的stream模块的配置,用于代理TCP和UDP流量。
  23. #
  24. # 首先,`worker_processes 1;`表示启动一个worker进程用于处理流量。
  25. # 接下来,`events { worker_connections 1024; }`表示每个worker进程可以同时处理最多1024个连接。
  26. # 在stream块里面,定义了一个名为`backend`的upstream,用于负载均衡和故障转移。
  27. # `least_conn`表示使用最少连接算法进行负载均衡。
  28. # `hash $remote_addr consistent`表示用客户端的IP地址进行哈希分配请求,保持相同IP的请求始终访问同一台服务器。
  29. # `server`指令用于定义后端的服务器,每个服务器都有一个IP地址和端口号,以及一些可选的参数。
  30. # `max_fails=3`表示当一个服务器连续失败3次时将其标记为不可用。
  31. # `fail_timeout=30s`表示如果一个服务器被标记为不可用,nginx将在30秒后重新尝试。
  32. # 在server块内部,定义了一个监听地址为127.0.0.1:8443的服务器。
  33. # `proxy_connect_timeout 1s`表示与后端服务器建立连接的超时时间为1秒。
  34. # `proxy_pass backend`表示将流量代理到名为backend的上游服务器组。
  35. #
  36. # 总结起来,这段配置将流量代理到一个包含3个后端服务器的上游服务器组中,使用最少连接算法进行负载均衡,并根据客户端的IP地址进行哈希分配请求。如果一个服务器连续失败3次,则将其标记为不可用,并在30秒后重新尝试。
  37. # 写入启动配置文件
  38. cat > /etc/systemd/system/kube-nginx.service <<EOF
  39. [Unit]
  40. Description=kube-apiserver nginx proxy
  41. After=network.target
  42. After=network-online.target
  43. Wants=network-online.target
  44. [Service]
  45. Type=forking
  46. ExecStartPre=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx -t
  47. ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx
  48. ExecReload=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/kube-nginx.conf -p /usr/local/nginx -s reload
  49. PrivateTmp=true
  50. Restart=always
  51. RestartSec=5
  52. StartLimitInterval=0
  53. LimitNOFILE=65536
  54. [Install]
  55. WantedBy=multi-user.target
  56. EOF
  57. # 这是一个用于kube-apiserver的NGINX代理的systemd单位文件。
  58. #
  59. # [Unit]部分包含了单位的描述和依赖关系。它指定了在network.target和network-online.target之后启动,并且需要network-online.target。
  60. #
  61. # [Service]部分定义了如何运行该服务。Type指定了服务进程的类型(forking表示主进程会派生一个子进程)。ExecStartPre指定了在服务启动之前需要运行的命令,用于检查NGINX配置文件的语法是否正确。ExecStart指定了启动服务所需的命令。ExecReload指定了在重新加载配置文件时运行的命令。PrivateTmp设置为true表示将为服务创建一个私有的临时文件系统。Restart和RestartSec用于设置服务的自动重启机制。StartLimitInterval设置为0表示无需等待,可以立即重启服务。LimitNOFILE指定了服务的文件描述符的限制。
  62. #
  63. # [Install]部分指定了在哪些target下该单位应该被启用。
  64. #
  65. # 综上所述,此单位文件用于启动和管理kube-apiserver的NGINX代理服务。它通过NGINX来反向代理和负载均衡kube-apiserver的请求。该服务会在系统启动时自动启动,并具有自动重启的机制。
  66. # 设置开机自启
  67. systemctl daemon-reload
  68. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  69. systemctl enable --now kube-nginx.service
  70. # 启用并立即启动kube-nginx.service单元。kube-nginx.service是kube-nginx守护进程的systemd服务单元。
  71. systemctl restart kube-nginx.service
  72. # 重启kube-nginx.service单元,即重新启动kube-nginx守护进程。
  73. systemctl status kube-nginx.service
  74. # kube-nginx.service单元的当前状态,包括运行状态、是否启用等信息。

5.2 keepalived和haproxy 高可用方案

5.2.1安装keepalived和haproxy服务

  1. systemctl disable --now firewalld
  2. setenforce 0
  3. sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
  4. yum -y install keepalived haproxy

5.2.2修改haproxy配置文件(配置文件一样)

  1. # cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
  2. cat >/etc/haproxy/haproxy.cfg<<"EOF"
  3. global
  4. maxconn 2000
  5. ulimit-n 16384
  6. log 127.0.0.1 local0 err
  7. stats timeout 30s
  8. defaults
  9. log global
  10. mode http
  11. option httplog
  12. timeout connect 5000
  13. timeout client 50000
  14. timeout server 50000
  15. timeout http-request 15s
  16. timeout http-keep-alive 15s
  17. frontend monitor-in
  18. bind *:33305
  19. mode http
  20. option httplog
  21. monitor-uri /monitor
  22. frontend k8s-master
  23. bind 0.0.0.0:9443
  24. bind 127.0.0.1:9443
  25. mode tcp
  26. option tcplog
  27. tcp-request inspect-delay 5s
  28. default_backend k8s-master
  29. backend k8s-master
  30. mode tcp
  31. option tcplog
  32. option tcp-check
  33. balance roundrobin
  34. default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
  35. server k8s-master01 192.168.1.31:6443 check
  36. server k8s-master02 192.168.1.32:6443 check
  37. server k8s-master03 192.168.1.33:6443 check
  38. EOF

参数

  1. 这段配置代码是指定了一个HAProxy负载均衡器的配置。下面对各部分进行详细解释:
  2. 1. global:
  3. - maxconn 2000: 设置每个进程的最大连接数为2000
  4. - ulimit-n 16384: 设置每个进程的最大文件描述符数为16384
  5. - log 127.0.0.1 local0 err: 指定日志的输出地址为本地主机的127.0.0.1,并且只记录错误级别的日志。
  6. - stats timeout 30s: 设置查看负载均衡器统计信息的超时时间为30秒。
  7. 2. defaults:
  8. - log global: 使默认日志与global部分相同。
  9. - mode http: 设定负载均衡器的工作模式为HTTP模式。
  10. - option httplog: 使负载均衡器记录HTTP协议的日志。
  11. - timeout connect 5000: 设置与后端服务器建立连接的超时时间为5秒。
  12. - timeout client 50000: 设置与客户端的连接超时时间为50秒。
  13. - timeout server 50000: 设置与后端服务器连接的超时时间为50秒。
  14. - timeout http-request 15s: 设置处理HTTP请求的超时时间为15秒。
  15. - timeout http-keep-alive 15s: 设置保持HTTP连接的超时时间为15秒。
  16. 3. frontend monitor-in:
  17. - bind *:33305: 监听所有IP地址的33305端口。
  18. - mode http: 设定frontend的工作模式为HTTP模式。
  19. - option httplog: 记录HTTP协议的日志。
  20. - monitor-uri /monitor: 设置监控URI为/monitor
  21. 4. frontend k8s-master:
  22. - bind 0.0.0.0:9443: 监听所有IP地址的9443端口。
  23. - bind 127.0.0.1:9443: 监听本地主机的9443端口。
  24. - mode tcp: 设定frontend的工作模式为TCP模式。
  25. - option tcplog: 记录TCP协议的日志。
  26. - tcp-request inspect-delay 5s: 设置在接收到请求后延迟5秒进行检查。
  27. - default_backend k8s-master: 设置默认的后端服务器组为k8s-master
  28. 5. backend k8s-master:
  29. - mode tcp: 设定backend的工作模式为TCP模式。
  30. - option tcplog: 记录TCP协议的日志。
  31. - option tcp-check: 启用TCP检查功能。
  32. - balance roundrobin: 使用轮询算法进行负载均衡。
  33. - default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100: 设置默认的服务器参数。
  34. - server k8s-master01 192.168.1.31:6443 check: 增加一个名为k8s-master01的服务器,IP地址为192.168.1.31,端口号为6443,并对其进行健康检查。
  35. - server k8s-master02 192.168.1.32:6443 check: 增加一个名为k8s-master02的服务器,IP地址为192.168.1.32,端口号为6443,并对其进行健康检查。
  36. - server k8s-master03 192.168.1.33:6443 check: 增加一个名为k8s-master03的服务器,IP地址为192.168.1.33,端口号为6443,并对其进行健康检查。
  37. 以上就是这段配置代码的详细解释。它主要定义了全局配置、默认配置、前端监听和后端服务器组的相关参数和设置。通过这些配置,可以实现负载均衡和监控功能。

5.2.3Master01配置keepalived master节点

  1. #cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  2. cat > /etc/keepalived/keepalived.conf << EOF
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id LVS_DEVEL
  6. }
  7. vrrp_script chk_apiserver {
  8. script "/etc/keepalived/check_apiserver.sh"
  9. interval 5
  10. weight -5
  11. fall 2
  12. rise 1
  13. }
  14. vrrp_instance VI_1 {
  15. state MASTER
  16. # 注意网卡名
  17. interface eth0
  18. mcast_src_ip 192.168.1.31
  19. virtual_router_id 51
  20. priority 100
  21. nopreempt
  22. advert_int 2
  23. authentication {
  24. auth_type PASS
  25. auth_pass K8SHA_KA_AUTH
  26. }
  27. virtual_ipaddress {
  28. 192.168.1.36
  29. }
  30. track_script {
  31. chk_apiserver
  32. } }
  33. EOF

5.2.4Master02配置keepalived backup节点

  1. # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  2. cat > /etc/keepalived/keepalived.conf << EOF
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id LVS_DEVEL
  6. }
  7. vrrp_script chk_apiserver {
  8. script "/etc/keepalived/check_apiserver.sh"
  9. interval 5
  10. weight -5
  11. fall 2
  12. rise 1
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. # 注意网卡名
  17. interface eth0
  18. mcast_src_ip 192.168.1.32
  19. virtual_router_id 51
  20. priority 80
  21. nopreempt
  22. advert_int 2
  23. authentication {
  24. auth_type PASS
  25. auth_pass K8SHA_KA_AUTH
  26. }
  27. virtual_ipaddress {
  28. 192.168.1.36
  29. }
  30. track_script {
  31. chk_apiserver
  32. } }
  33. EOF

5.2.5Master03配置keepalived backup节点

  1. # cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
  2. cat > /etc/keepalived/keepalived.conf << EOF
  3. ! Configuration File for keepalived
  4. global_defs {
  5. router_id LVS_DEVEL
  6. }
  7. vrrp_script chk_apiserver {
  8. script "/etc/keepalived/check_apiserver.sh"
  9. interval 5
  10. weight -5
  11. fall 2
  12. rise 1
  13. }
  14. vrrp_instance VI_1 {
  15. state BACKUP
  16. # 注意网卡名
  17. interface eth0
  18. mcast_src_ip 192.168.1.33
  19. virtual_router_id 51
  20. priority 50
  21. nopreempt
  22. advert_int 2
  23. authentication {
  24. auth_type PASS
  25. auth_pass K8SHA_KA_AUTH
  26. }
  27. virtual_ipaddress {
  28. 192.168.1.36
  29. }
  30. track_script {
  31. chk_apiserver
  32. } }
  33. EOF

参数

  1. 这是一个用于配置keepalived的配置文件。下面是对每个部分的详细解释:
  2. - `global_defs`部分定义了全局参数。
  3. - `router_id`参数指定了当前路由器的标识,这里设置为"LVS_DEVEL"
  4. - `vrrp_script`部分定义了一个VRRP脚本。`chk_apiserver`是脚本的名称,
  5. - `script`参数指定了脚本的路径。该脚本每5秒执行一次,返回值为0表示服务正常,返回值为1表示服务异常。
  6. - `weight`参数指定了根据脚本返回的值来调整优先级,这里设置为-5
  7. - `fall`参数指定了失败阈值,当连续2次脚本返回值为1时认为服务异常。
  8. - `rise`参数指定了恢复阈值,当连续1次脚本返回值为0时认为服务恢复正常。
  9. - `vrrp_instance`部分定义了一个VRRP实例。`VI_1`是实例的名称。
  10. - `state`参数指定了当前实例的状态,这里设置为MASTER表示当前实例是主节点。
  11. - `interface`参数指定了要监听的网卡,这里设置为eth0
  12. - `mcast_src_ip`参数指定了VRRP报文的源IP地址,这里设置为192.168.1.31
  13. - `virtual_router_id`参数指定了虚拟路由器的ID,这里设置为51
  14. - `priority`参数指定了实例的优先级,优先级越高(数值越大)越有可能被选为主节点。
  15. - `nopreempt`参数指定了当主节点失效后不要抢占身份,即不要自动切换为主节点。
  16. - `advert_int`参数指定了发送广播的间隔时间,这里设置为2秒。
  17. - `authentication`部分指定了认证参数
  18. - `auth_type`参数指定了认证类型,这里设置为PASS表示使用密码认证,
  19. - `auth_pass`参数指定了认证密码,这里设置为K8SHA_KA_AUTH
  20. - `virtual_ipaddress`部分指定了虚拟IP地址,这里设置为192.168.1.36
  21. - `track_script`部分指定了要跟踪的脚本,这里跟踪了chk_apiserver脚本。

5.2.6健康检查脚本配置(lb主机)

  1. cat > /etc/keepalived/check_apiserver.sh << EOF
  2. #!/bin/bash
  3. err=0
  4. for k in \$(seq 1 3)
  5. do
  6. check_code=\$(pgrep haproxy)
  7. if [[ \$check_code == "" ]]; then
  8. err=\$(expr \$err + 1)
  9. sleep 1
  10. continue
  11. else
  12. err=0
  13. break
  14. fi
  15. done
  16. if [[ \$err != "0" ]]; then
  17. echo "systemctl stop keepalived"
  18. /usr/bin/systemctl stop keepalived
  19. exit 1
  20. else
  21. exit 0
  22. fi
  23. EOF
  24. # 给脚本授权
  25. chmod +x /etc/keepalived/check_apiserver.sh
  26. # 这段脚本是一个简单的bash脚本,主要用来检查是否有名为haproxy的进程正在运行。
  27. #
  28. # 脚本的主要逻辑如下:
  29. # 1. 首先设置一个变量err为0,用来记录错误次数。
  30. # 2. 使用一个循环,在循环内部执行以下操作:
  31. # a. 使用pgrep命令检查是否有名为haproxy的进程在运行。如果不存在该进程,将err加1,并暂停1秒钟,然后继续下一次循环。
  32. # b. 如果存在haproxy进程,将err重置为0,并跳出循环。
  33. # 3. 检查err的值,如果不为0,表示检查失败,输出一条错误信息并执行“systemctl stop keepalived”命令停止keepalived进程,并退出脚本返回1。
  34. # 4. 如果err的值为0,表示检查成功,退出脚本返回0。
  35. #
  36. # 该脚本的主要作用是检查是否存在运行中的haproxy进程,如果无法检测到haproxy进程,将停止keepalived进程并返回错误状态。如果haproxy进程存在,则返回成功状态。这个脚本可能是作为一个健康检查脚本的一部分,在确保haproxy服务可用的情况下,才继续运行其他操作。

5.2.7启动服务

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now haproxy.service
  4. # 启用并立即启动haproxy.service单元。haproxy.service是haproxy守护进程的systemd服务单元。
  5. systemctl enable --now keepalived.service
  6. # 启用并立即启动keepalived.service单元。keepalived.service是keepalived守护进程的systemd服务单元。
  7. systemctl status haproxy.service
  8. # haproxy.service单元的当前状态,包括运行状态、是否启用等信息。
  9. systemctl status keepalived.service
  10. # keepalived.service单元的当前状态,包括运行状态、是否启用等信息。

5.2.8测试高可用

  1. # 能ping同
  2. [root@k8s-node02 ~]# ping 192.168.1.36
  3. # 能telnet访问
  4. [root@k8s-node02 ~]# telnet 192.168.1.36 9443
  5. # 关闭主节点,看vip是否漂移到备节点

6.k8s组件配置

所有k8s节点创建以下目录

  1. mkdir -p /etc/kubernetes/manifests/ /etc/systemd/system/kubelet.service.d /var/lib/kubelet /var/log/kubernetes

6.1.创建apiserver(所有master节点)

6.1.1master01节点配置

  1. cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
  2. [Unit]
  3. Description=Kubernetes API Server
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-apiserver \ --v=2 \ --allow-privileged=true \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --advertise-address=192.168.1.31 \ --service-cluster-ip-range=10.96.0.0/12,fd00:1111::/112 \ --service-node-port-range=30000-32767 \ --etcd-servers=https://192.168.1.31:2379,https://192.168.1.32:2379,https://192.168.1.33:2379 \ --etcd-cafile=/etc/etcd/ssl/etcd-ca.pem \ --etcd-certfile=/etc/etcd/ssl/etcd.pem \ --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \ --client-ca-file=/etc/kubernetes/pki/ca.pem \ --tls-cert-file=/etc/kubernetes/pki/apiserver.pem \ --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem \ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver.pem \ --kubelet-client-key=/etc/kubernetes/pki/apiserver-key.pem \ --service-account-key-file=/etc/kubernetes/pki/sa.pub \ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \ --service-account-issuer=https://kubernetes.default.svc.cluster.local \ --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota --authorization-mode=Node,RBAC \ --enable-bootstrap-token-auth=true \ --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem \ --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem \ --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem \ --requestheader-allowed-names=aggregator \ --requestheader-group-headers=X-Remote-Group \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-username-headers=X-Remote-User \ --enable-aggregator-routing=true
  8. Restart=on-failure
  9. RestartSec=10s
  10. LimitNOFILE=65535
  11. [Install]
  12. WantedBy=multi-user.target
  13. EOF

6.1.2master02节点配置

  1. cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
  2. [Unit]
  3. Description=Kubernetes API Server
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-apiserver \ --v=2 \ --allow-privileged=true \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --advertise-address=192.168.1.32 \ --service-cluster-ip-range=10.96.0.0/12,fd00:1111::/112 \ --service-node-port-range=30000-32767 \ --etcd-servers=https://192.168.1.31:2379,https://192.168.1.32:2379,https://192.168.1.33:2379 \ --etcd-cafile=/etc/etcd/ssl/etcd-ca.pem \ --etcd-certfile=/etc/etcd/ssl/etcd.pem \ --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \ --client-ca-file=/etc/kubernetes/pki/ca.pem \ --tls-cert-file=/etc/kubernetes/pki/apiserver.pem \ --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem \ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver.pem \ --kubelet-client-key=/etc/kubernetes/pki/apiserver-key.pem \ --service-account-key-file=/etc/kubernetes/pki/sa.pub \ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \ --service-account-issuer=https://kubernetes.default.svc.cluster.local \ --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota \ --authorization-mode=Node,RBAC \ --enable-bootstrap-token-auth=true \ --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem \ --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem \ --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem \ --requestheader-allowed-names=aggregator \ --requestheader-group-headers=X-Remote-Group \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-username-headers=X-Remote-User \ --enable-aggregator-routing=true
  8. Restart=on-failure
  9. RestartSec=10s
  10. LimitNOFILE=65535
  11. [Install]
  12. WantedBy=multi-user.target
  13. EOF

6.1.3master03节点配置

  1. cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
  2. [Unit]
  3. Description=Kubernetes API Server
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-apiserver \ --v=2 \ --allow-privileged=true \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --advertise-address=192.168.1.33 \ --service-cluster-ip-range=10.96.0.0/12,fd00:1111::/112 \ --service-node-port-range=30000-32767 \ --etcd-servers=https://192.168.1.31:2379,https://192.168.1.32:2379,https://192.168.1.33:2379 \ --etcd-cafile=/etc/etcd/ssl/etcd-ca.pem \ --etcd-certfile=/etc/etcd/ssl/etcd.pem \ --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem \ --client-ca-file=/etc/kubernetes/pki/ca.pem \ --tls-cert-file=/etc/kubernetes/pki/apiserver.pem \ --tls-private-key-file=/etc/kubernetes/pki/apiserver-key.pem \ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver.pem \ --kubelet-client-key=/etc/kubernetes/pki/apiserver-key.pem \ --service-account-key-file=/etc/kubernetes/pki/sa.pub \ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \ --service-account-issuer=https://kubernetes.default.svc.cluster.local \ --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota \ --authorization-mode=Node,RBAC \ --enable-bootstrap-token-auth=true \ --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem \ --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem \ --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem \ --requestheader-allowed-names=aggregator \ --requestheader-group-headers=X-Remote-Group \ --requestheader-extra-headers-prefix=X-Remote-Extra- \ --requestheader-username-headers=X-Remote-User \ --enable-aggregator-routing=true
  8. Restart=on-failure
  9. RestartSec=10s
  10. LimitNOFILE=65535
  11. [Install]
  12. WantedBy=multi-user.target
  13. EOF

参数

  1. 该配置文件是用于定义Kubernetes API Serversystemd服务的配置。systemd是一个用于启动和管理Linux系统服务的守护进程。
  2. [Unit]
  3. - Description: 服务的描述信息,用于显示在日志和系统管理工具中。
  4. - Documentation: 提供关于服务的文档链接。
  5. - After: 规定服务依赖于哪些其他服务或单元。在这个例子中,API Server服务在网络目标启动之后启动。
  6. [Service]
  7. - ExecStart: 定义服务的命令行参数和命令。这里指定了API Server的启动命令,包括各种参数选项。
  8. - Restart: 指定当服务退出时应该如何重新启动。在这个例子中,服务在失败时将被重新启动。
  9. - RestartSec: 指定两次重新启动之间的等待时间。
  10. - LimitNOFILE: 指定进程可以打开的文件描述符的最大数量。
  11. [Install]
  12. - WantedBy: 指定服务应该安装到哪个系统目标。在这个例子中,服务将被安装到multi-user.target目标,以便在多用户模式下启动。
  13. 上述配置文件中定义的kube-apiserver服务将以指定的参数运行,这些参数包括:
  14. - `--v=2` 指定日志级别为2,打印详细的API Server日志。
  15. - `--allow-privileged=true` 允许特权容器运行。
  16. - `--bind-address=0.0.0.0` 绑定API Server监听的IP地址。
  17. - `--secure-port=6443` 指定API Server监听的安全端口。
  18. - `--advertise-address=192.168.1.31` 广告API Server的地址。
  19. - `--service-cluster-ip-range=10.96.0.0/12,fd00:1111::/112` 指定服务CIDR范围。
  20. - `--service-node-port-range=30000-32767` 指定NodePort的范围。
  21. - `--etcd-servers=https://192.168.1.31:2379,https://192.168.1.32:2379,https://192.168.1.33:2379` 指定etcd服务器的地址。
  22. - `--etcd-cafile` 指定etcd服务器的CA证书。
  23. - `--etcd-certfile` 指定etcd服务器的证书。
  24. - `--etcd-keyfile` 指定etcd服务器的私钥。
  25. - `--client-ca-file` 指定客户端CA证书。
  26. - `--tls-cert-file` 指定服务的证书。
  27. - `--tls-private-key-file` 指定服务的私钥。
  28. - `--kubelet-client-certificate` `--kubelet-client-key` 指定与kubelet通信的客户端证书和私钥。
  29. - `--service-account-key-file` 指定服务账户公钥文件。
  30. - `--service-account-signing-key-file` 指定服务账户签名密钥文件。
  31. - `--service-account-issuer` 指定服务账户的发布者。
  32. - `--kubelet-preferred-address-types` 指定kubelet通信时的首选地址类型。
  33. - `--enable-admission-plugins` 启用一系列准入插件。
  34. - `--authorization-mode` 指定授权模式。
  35. - `--enable-bootstrap-token-auth` 启用引导令牌认证。
  36. - `--requestheader-client-ca-file` 指定请求头中的客户端CA证书。
  37. - `--proxy-client-cert-file` `--proxy-client-key-file` 指定代理客户端的证书和私钥。
  38. - `--requestheader-allowed-names` 指定请求头中允许的名字。
  39. - `--requestheader-group-headers` 指定请求头中的组头。
  40. - `--requestheader-extra-headers-prefix` 指定请求头中的额外头前缀。
  41. - `--requestheader-username-headers` 指定请求头中的用户名头。
  42. - `--enable-aggregator-routing` 启用聚合路由。
  43. 整个配置文件为Kubernetes API Server提供了必要的参数,以便正确地启动和运行。

6.1.4启动apiserver(所有master节点)

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now kube-apiserver.service
  4. # 启用并立即启动kube-apiserver.service单元。kube-apiserver.service是kube-apiserver守护进程的systemd服务单元。
  5. systemctl restart kube-apiserver.service
  6. # 重启kube-apiserver.service单元,即重新启动etcd守护进程。
  7. systemctl status kube-apiserver.service
  8. # kube-apiserver.service单元的当前状态,包括运行状态、是否启用等信息。

6.2.配置kube-controller-manager service

  1. # 所有master节点配置,且配置相同
  2. # 172.16.0.0/12为pod网段,按需求设置你自己的网段
  3. cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
  4. [Unit]
  5. Description=Kubernetes Controller Manager
  6. Documentation=https://github.com/kubernetes/kubernetes
  7. After=network.target
  8. [Service]
  9. ExecStart=/usr/local/bin/kube-controller-manager \ --v=2 \ --bind-address=0.0.0.0 \ --root-ca-file=/etc/kubernetes/pki/ca.pem \ --cluster-signing-cert-file=/etc/kubernetes/pki/ca.pem \ --cluster-signing-key-file=/etc/kubernetes/pki/ca-key.pem \ --service-account-private-key-file=/etc/kubernetes/pki/sa.key \ --kubeconfig=/etc/kubernetes/controller-manager.kubeconfig \ --leader-elect=true \ --use-service-account-credentials=true \ --node-monitor-grace-period=40s \ --node-monitor-period=5s \ --controllers=*,bootstrapsigner,tokencleaner \ --allocate-node-cidrs=true \ --service-cluster-ip-range=10.96.0.0/12,fd00:1111::/112 \ --cluster-cidr=172.16.0.0/12,fc00:2222::/112 \ --node-cidr-mask-size-ipv4=24 \ --node-cidr-mask-size-ipv6=120 \ --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem
  10. Restart=always
  11. RestartSec=10s
  12. [Install]
  13. WantedBy=multi-user.target
  14. EOF

参数

  1. 这是一个用于启动 Kubernetes 控制器管理器的 systemd 服务单元文件。下面是对每个部分的详细解释:
  2. [Unit]:单元的基本信息部分,用于描述和标识这个服务单元。
  3. Description:服务单元的描述信息,说明了该服务单元的作用,这里是 Kubernetes 控制器管理器。
  4. Documentation:可选项,提供了关于该服务单元的文档链接。
  5. After:定义了该服务单元在哪些其他单元之后启动,这里是 network.target,即在网络服务启动之后启动。
  6. [Service]:定义了服务的运行参数和行为。
  7. ExecStart:指定服务启动时执行的命令,这里是 /usr/local/bin/kube-controller-manager,并通过后续的行继续传递了一系列的参数设置。
  8. Restart:定义了服务在退出后的重新启动策略,这里设置为 always,表示总是重新启动服务。
  9. RestartSec:定义了重新启动服务的时间间隔,这里设置为 10 秒。
  10. [Install]:定义了如何安装和启用服务单元。
  11. WantedBy:指定了服务单元所属的 target,这里是 multi-user.target,表示启动多用户模式下的服务。
  12. ExecStart 中传递的参数说明如下:
  13. --v=2:设置日志的详细级别为 2
  14. --bind-address=0.0.0.0:绑定的 IP 地址,用于监听 Kubernetes 控制平面的请求,这里设置为 0.0.0.0,表示监听所有网络接口上的请求。
  15. --root-ca-file:根证书文件的路径,用于验证其他组件的证书。
  16. --cluster-signing-cert-file:用于签名集群证书的证书文件路径。
  17. --cluster-signing-key-file:用于签名集群证书的私钥文件路径。
  18. --service-account-private-key-file:用于签名服务账户令牌的私钥文件路径。
  19. --kubeconfigkubeconfig 文件的路径,包含了与 Kubernetes API 服务器通信所需的配置信息。
  20. --leader-elect=true:启用 Leader 选举机制,确保只有一个控制器管理器作为 leader 在运行。
  21. --use-service-account-credentials=true:使用服务账户的凭据进行认证和授权。
  22. --node-monitor-grace-period=40s:节点监控的优雅退出时间,节点长时间不响应时会触发节点驱逐。
  23. --node-monitor-period=5s:节点监控的检测周期,用于检测节点是否正常运行。
  24. --controllers:指定要运行的控制器类型,在这里使用了通配符 *,表示运行所有的控制器,同时还包括了 bootstrapsigner tokencleaner 控制器。
  25. --allocate-node-cidrs=true:为节点分配 CIDR 子网,用于分配 Pod 网络地址。
  26. --service-cluster-ip-range:定义 Service IP 范围,这里设置为 10.96.0.0/12 fd00::/108
  27. --cluster-cidr:定义集群的 CIDR 范围,这里设置为 172.16.0.0/12 fc00::/48
  28. --node-cidr-mask-size-ipv4:分配给每个节点的 IPv4 子网掩码大小,默认是 24
  29. --node-cidr-mask-size-ipv6:分配给每个节点的 IPv6 子网掩码大小,默认是 120
  30. --requestheader-client-ca-file:设置请求头中客户端 CA 的证书文件路径,用于认证请求头中的 CA 证书。
  31. 这个服务单元文件描述了 Kubernetes 控制器管理器的启动参数和行为,并且定义了服务的依赖关系和重新启动策略。通过 systemd 启动该服务单元,即可启动 Kubernetes 控制器管理器组件。

6.2.1启动kube-controller-manager,并查看状态

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now kube-controller-manager.service
  4. # 启用并立即启动kube-controller-manager.service单元。kube-controller-manager.service是kube-controller-manager守护进程的systemd服务单元。
  5. systemctl restart kube-controller-manager.service
  6. # 重启kube-controller-manager.service单元,即重新启动etcd守护进程。
  7. systemctl status kube-controller-manager.service
  8. # kube-controller-manager.service单元的当前状态,包括运行状态、是否启用等信息。

6.3.配置kube-scheduler service

6.3.1所有master节点配置,且配置相同

  1. cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
  2. [Unit]
  3. Description=Kubernetes Scheduler
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-scheduler \ --v=2 \ --bind-address=0.0.0.0 \ --leader-elect=true \ --kubeconfig=/etc/kubernetes/scheduler.kubeconfig
  8. Restart=always
  9. RestartSec=10s
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF

参数

  1. 这是一个用于启动 Kubernetes 调度器的 systemd 服务单元文件。下面是对每个部分的详细解释:
  2. [Unit]:单元的基本信息部分,用于描述和标识这个服务单元。
  3. Description:服务单元的描述信息,说明了该服务单元的作用,这里是 Kubernetes 调度器。
  4. Documentation:可选项,提供了关于该服务单元的文档链接。
  5. After:定义了该服务单元在哪些其他单元之后启动,这里是 network.target,即在网络服务启动之后启动。
  6. [Service]:定义了服务的运行参数和行为。
  7. ExecStart:指定服务启动时执行的命令,这里是 /usr/local/bin/kube-scheduler,并通过后续的行继续传递了一系列的参数设置。
  8. Restart:定义了服务在退出后的重新启动策略,这里设置为 always,表示总是重新启动服务。
  9. RestartSec:定义了重新启动服务的时间间隔,这里设置为 10 秒。
  10. [Install]:定义了如何安装和启用服务单元。
  11. WantedBy:指定了服务单元所属的 target,这里是 multi-user.target,表示启动多用户模式下的服务。
  12. ExecStart 中传递的参数说明如下:
  13. --v=2:设置日志的详细级别为 2
  14. --bind-address=0.0.0.0:绑定的 IP 地址,用于监听 Kubernetes 控制平面的请求,这里设置为 0.0.0.0,表示监听所有网络接口上的请求。
  15. --leader-elect=true:启用 Leader 选举机制,确保只有一个调度器作为 leader 在运行。
  16. --kubeconfig=/etc/kubernetes/scheduler.kubeconfigkubeconfig 文件的路径,包含了与 Kubernetes API 服务器通信所需的配置信息。
  17. 这个服务单元文件描述了 Kubernetes 调度器的启动参数和行为,并且定义了服务的依赖关系和重新启动策略。通过 systemd 启动该服务单元,即可启动 Kubernetes 调度器组件。

6.3.2启动并查看服务状态

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now kube-scheduler.service
  4. # 启用并立即启动kube-scheduler.service单元。kube-scheduler.service是kube-scheduler守护进程的systemd服务单元。
  5. systemctl restart kube-scheduler.service
  6. # 重启kube-scheduler.service单元,即重新启动etcd守护进程。
  7. systemctl status kube-scheduler.service
  8. # kube-scheduler.service单元的当前状态,包括运行状态、是否启用等信息。

7.TLS Bootstrapping配置

7.1在master01上配置

  1. # 在《5.高可用配置》选择使用那种高可用方案
  2. # 若使用 haproxy、keepalived 那么为 `--server=https://192.168.1.36:8443`
  3. # 若使用 nginx方案,那么为 `--server=https://127.0.0.1:8443`
  4. cd bootstrap
  5. kubectl config set-cluster kubernetes --certificate-authority=/etc/kubernetes/pki/ca.pem --embed-certs=true --server=https://127.0.0.1:8443 --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig
  6. # 这是一个使用 kubectl 命令设置 Kubernetes 集群配置的命令示例。下面是对每个选项的详细解释:
  7. #
  8. # config set-cluster kubernetes:指定要设置的集群名称为 "kubernetes",表示要修改名为 "kubernetes" 的集群配置。
  9. # --certificate-authority=/etc/kubernetes/pki/ca.pem:指定证书颁发机构(CA)的证书文件路径,用于验证服务器证书的有效性。
  10. # --embed-certs=true:将证书文件嵌入到生成的 kubeconfig 文件中。这样可以避免在 kubeconfig 文件中引用外部证书文件。
  11. # --server=https://127.0.0.1:8443:指定 Kubernetes API 服务器的地址和端口,这里使用的是 https 协议和本地地址(127.0.0.1),端口号为 8443。你可以根据实际环境修改该参数。
  12. # --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig:指定 kubeconfig 文件的路径和名称,这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。
  13. # 通过执行此命令,你可以设置名为 "kubernetes" 的集群配置,并提供 CA 证书、API 服务器地址和端口,并将这些配置信息嵌入到 bootstrap-kubelet.kubeconfig 文件中。这个 kubeconfig 文件可以用于认证和授权 kubelet 组件与 Kubernetes API 服务器之间的通信。请确保路径和文件名与实际环境中的配置相匹配。
  14. kubectl config set-credentials tls-bootstrap-token-user --token=c8ad9c.2e4d610cf3e7426e --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig
  15. # 这是一个使用 kubectl 命令设置凭证信息的命令示例。下面是对每个选项的详细解释:
  16. #
  17. # config set-credentials tls-bootstrap-token-user:指定要设置的凭证名称为 "tls-bootstrap-token-user",表示要修改名为 "tls-bootstrap-token-user" 的用户凭证配置。
  18. # --token=c8ad9c.2e4d610cf3e7426e:指定用户的身份验证令牌(token)。在这个示例中,令牌是 c8ad9c.2e4d610cf3e7426e。你可以根据实际情况修改该令牌。
  19. # --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig:指定 kubeconfig 文件的路径和名称,这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。
  20. # 通过执行此命令,你可以设置名为 "tls-bootstrap-token-user" 的用户凭证,并将令牌信息加入到 bootstrap-kubelet.kubeconfig 文件中。这个 kubeconfig 文件可以用于认证和授权 kubelet 组件与 Kubernetes API 服务器之间的通信。请确保路径和文件名与实际环境中的配置相匹配。
  21. kubectl config set-context tls-bootstrap-token-user@kubernetes --cluster=kubernetes --user=tls-bootstrap-token-user --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig
  22. # 这是一个使用 kubectl 命令设置上下文信息的命令示例。下面是对每个选项的详细解释:
  23. #
  24. # config set-context tls-bootstrap-token-user@kubernetes:指定要设置的上下文名称为 "tls-bootstrap-token-user@kubernetes",表示要修改名为 "tls-bootstrap-token-user@kubernetes" 的上下文配置。
  25. # --cluster=kubernetes:指定上下文关联的集群名称为 "kubernetes",表示使用名为 "kubernetes" 的集群配置。
  26. # --user=tls-bootstrap-token-user:指定上下文关联的用户凭证名称为 "tls-bootstrap-token-user",表示使用名为 "tls-bootstrap-token-user" 的用户凭证配置。
  27. # --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig:指定 kubeconfig 文件的路径和名称,这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。
  28. # 通过执行此命令,你可以设置名为 "tls-bootstrap-token-user@kubernetes" 的上下文,并将其关联到名为 "kubernetes" 的集群配置和名为 "tls-bootstrap-token-user" 的用户凭证配置。这样,bootstrap-kubelet.kubeconfig 文件就包含了完整的上下文信息,可以用于指定与 Kubernetes 集群建立连接时要使用的集群和凭证。请确保路径和文件名与实际环境中的配置相匹配。
  29. kubectl config use-context tls-bootstrap-token-user@kubernetes --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig
  30. # 这是一个使用 kubectl 命令设置当前上下文的命令示例。下面是对每个选项的详细解释:
  31. #
  32. # config use-context tls-bootstrap-token-user@kubernetes:指定要使用的上下文名称为 "tls-bootstrap-token-user@kubernetes",表示要将当前上下文切换为名为 "tls-bootstrap-token-user@kubernetes" 的上下文。
  33. # --kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig:指定 kubeconfig 文件的路径和名称,这里是 /etc/kubernetes/bootstrap-kubelet.kubeconfig。
  34. # 通过执行此命令,你可以将当前上下文设置为名为 "tls-bootstrap-token-user@kubernetes" 的上下文。这样,当你执行其他 kubectl 命令时,它们将使用该上下文与 Kubernetes 集群进行交互。请确保路径和文件名与实际环境中的配置相匹配。
  35. # token的位置在bootstrap.secret.yaml,如果修改的话到这个文件修改
  36. mkdir -p /root/.kube ; cp /etc/kubernetes/admin.kubeconfig /root/.kube/config

7.2查看集群状态,没问题的话继续后续操作

  1. # 1.28 版本只能查看到一个etcd 属于正常现象
  2. # export ETCDCTL_API=3
  3. # etcdctl --endpoints="192.168.1.33:2379,192.168.1.32:2379,192.168.1.31:2379" --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem --cert=/etc/kubernetes/pki/etcd/etcd.pem --key=/etc/kubernetes/pki/etcd/etcd-key.pem endpoint status --write-out=table
  4. kubectl get cs
  5. Warning: v1 ComponentStatus is deprecated in v1.19+
  6. NAME STATUS MESSAGE ERROR
  7. scheduler Healthy ok
  8. controller-manager Healthy ok
  9. etcd-0 Healthy ok
  10. # 切记执行,别忘记!!!
  11. kubectl create -f bootstrap.secret.yaml

8.node节点配置

8.1.在master01上将证书复制到node节点

  1. cd /etc/kubernetes/
  2. for NODE in k8s-master02 k8s-master03 k8s-node01 k8s-node02; do ssh $NODE mkdir -p /etc/kubernetes/pki; for FILE in pki/ca.pem pki/ca-key.pem pki/front-proxy-ca.pem bootstrap-kubelet.kubeconfig kube-proxy.kubeconfig; do scp /etc/kubernetes/$FILE $NODE:/etc/kubernetes/${FILE}; done; done

8.2.kubelet配置

注意 : 8.2.1 和 8.2.2 需要和 上方 2.1 和 2.2 对应起来

8.2.1当使用docker作为Runtime

  1. cat > /usr/lib/systemd/system/kubelet.service << EOF
  2. [Unit]
  3. Description=Kubernetes Kubelet
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network-online.target firewalld.service containerd.service
  6. Wants=network-online.target
  7. Requires=docker.socket containerd.service
  8. [Service]
  9. ExecStart=/usr/local/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --config=/etc/kubernetes/kubelet-conf.yml \ --container-runtime-endpoint=unix:///run/cri-dockerd.sock \ --node-labels=node.kubernetes.io/node=
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
  13. # 这是一个表示 Kubernetes Kubelet 服务的 systemd 单位文件示例。下面是对每个节([Unit]、[Service]、[Install])的详细解释:
  14. #
  15. # [Unit]
  16. #
  17. # Description=Kubernetes Kubelet:指定了此单位文件对应的服务描述信息为 "Kubernetes Kubelet"。
  18. # Documentation=...:指定了对该服务的文档链接。
  19. # - After: 说明该服务在哪些其他服务之后启动,这里是在网络在线、firewalld服务和containerd服务后启动。
  20. # - Wants: 说明该服务想要的其他服务,这里是网络在线服务。
  21. # - Requires: 说明该服务需要的其他服务,这里是docker.socket和containerd.service。
  22. # [Service]
  23. #
  24. # ExecStart=/usr/local/bin/kubelet ...:指定了启动 Kubelet 服务的命令和参数。这里使用的是 /usr/local/bin/kubelet 命令,并传递了一系列参数来配置 Kubelet 的运行。这些参数包括:
  25. # --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig:指定了用于引导 kubelet 的 kubeconfig 文件的路径和名称。
  26. # --kubeconfig=/etc/kubernetes/kubelet.kubeconfig:指定了 kubelet 的 kubeconfig 文件的路径和名称。
  27. # --config=/etc/kubernetes/kubelet-conf.yml:指定了 kubelet 的配置文件的路径和名称。
  28. # --container-runtime-endpoint=unix:///run/cri-dockerd.sock:指定了容器运行时接口的端点地址,这里使用的是 Docker 运行时(cri-dockerd)的 UNIX 套接字。
  29. # --node-labels=node.kubernetes.io/node=:指定了节点的标签。这里的示例只给节点添加了一个简单的标签 node.kubernetes.io/node=。
  30. # [Install]
  31. #
  32. # WantedBy=multi-user.target:指定了在 multi-user.target 被启动时,该服务应该被启用。
  33. # 通过这个单位文件,你可以配置 Kubelet 服务的启动参数,指定相关的配置文件和凭证文件,以及定义节点的标签。请确认路径和文件名与你的实际环境中的配置相匹配。
  34. # IPv6示例
  35. # 若不使用IPv6那么忽略此项即可
  36. # 下方 --node-ip 更换为每个节点的IP即可
  37. cat > /usr/lib/systemd/system/kubelet.service << EOF
  38. [Unit]
  39. Description=Kubernetes Kubelet
  40. Documentation=https://github.com/kubernetes/kubernetes
  41. After=network-online.target firewalld.service containerd.service
  42. Wants=network-online.target
  43. Requires=docker.socket containerd.service
  44. [Service]
  45. ExecStart=/usr/local/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --config=/etc/kubernetes/kubelet-conf.yml \ --container-runtime-endpoint=unix:///run/cri-dockerd.sock \ --node-labels=node.kubernetes.io/node= \ --node-ip=192.168.1.31,2408:822a:245:8c01::fab
  46. [Install]
  47. WantedBy=multi-user.target
  48. EOF

8.2.2当使用Containerd作为Runtime (推荐)

  1. mkdir -p /var/lib/kubelet /var/log/kubernetes /etc/systemd/system/kubelet.service.d /etc/kubernetes/manifests/
  2. # 所有k8s节点配置kubelet service
  3. cat > /usr/lib/systemd/system/kubelet.service << EOF
  4. [Unit]
  5. Description=Kubernetes Kubelet
  6. Documentation=https://github.com/kubernetes/kubernetes
  7. After=network-online.target firewalld.service containerd.service
  8. Wants=network-online.target
  9. Requires=docker.socket containerd.service
  10. [Service]
  11. ExecStart=/usr/local/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --config=/etc/kubernetes/kubelet-conf.yml \ --container-runtime-endpoint=unix:///run/containerd/containerd.sock \ --node-labels=node.kubernetes.io/node=
  12. [Install]
  13. WantedBy=multi-user.target
  14. EOF
  15. # 这是一个表示 Kubernetes Kubelet 服务的 systemd 单位文件示例。与之前相比,添加了 After 和 Requires 字段来指定依赖关系。
  16. #
  17. # [Unit]
  18. #
  19. # Description=Kubernetes Kubelet:指定了此单位文件对应的服务描述信息为 "Kubernetes Kubelet"。
  20. # Documentation=...:指定了对该服务的文档链接。
  21. # - After: 说明该服务在哪些其他服务之后启动,这里是在网络在线、firewalld服务和containerd服务后启动。
  22. # - Wants: 说明该服务想要的其他服务,这里是网络在线服务。
  23. # - Requires: 说明该服务需要的其他服务,这里是docker.socket和containerd.service。
  24. # [Service]
  25. #
  26. # ExecStart=/usr/local/bin/kubelet ...:指定了启动 Kubelet 服务的命令和参数,与之前的示例相同。
  27. # --container-runtime-endpoint=unix:///run/containerd/containerd.sock:修改了容器运行时接口的端点地址,将其更改为使用 containerd 运行时(通过 UNIX 套接字)。
  28. # [Install]
  29. #
  30. # WantedBy=multi-user.target:指定了在 multi-user.target 被启动时,该服务应该被启用。
  31. # 通过这个单位文件,你可以配置 Kubelet 服务的启动参数,并指定了它依赖的 containerd 服务。确保路径和文件名与你实际环境中的配置相匹配。
  32. # IPv6示例
  33. # 若不使用IPv6那么忽略此项即可
  34. # 下方 --node-ip 更换为每个节点的IP即可
  35. cat > /usr/lib/systemd/system/kubelet.service << EOF
  36. [Unit]
  37. Description=Kubernetes Kubelet
  38. Documentation=https://github.com/kubernetes/kubernetes
  39. After=network-online.target firewalld.service containerd.service
  40. Wants=network-online.target
  41. Requires=docker.socket containerd.service
  42. [Service]
  43. ExecStart=/usr/local/bin/kubelet \ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.kubeconfig \ --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ --config=/etc/kubernetes/kubelet-conf.yml \ --container-runtime-endpoint=unix:///run/containerd/containerd.sock \ --node-labels=node.kubernetes.io/node= \ --node-ip=192.168.1.31,2408:822a:245:8c01::fab
  44. [Install]
  45. WantedBy=multi-user.target
  46. EOF

8.2.3所有k8s节点创建kubelet的配置文件

  1. cat > /etc/kubernetes/kubelet-conf.yml <<EOF
  2. apiVersion: kubelet.config.k8s.io/v1beta1
  3. kind: KubeletConfiguration
  4. address: 0.0.0.0
  5. port: 10250
  6. readOnlyPort: 10255
  7. authentication:
  8. anonymous:
  9. enabled: false
  10. webhook:
  11. cacheTTL: 2m0s
  12. enabled: true
  13. x509:
  14. clientCAFile: /etc/kubernetes/pki/ca.pem
  15. authorization:
  16. mode: Webhook
  17. webhook:
  18. cacheAuthorizedTTL: 5m0s
  19. cacheUnauthorizedTTL: 30s
  20. cgroupDriver: systemd
  21. cgroupsPerQOS: true
  22. clusterDNS:
  23. - 10.96.0.10
  24. clusterDomain: cluster.local
  25. containerLogMaxFiles: 5
  26. containerLogMaxSize: 10Mi
  27. contentType: application/vnd.kubernetes.protobuf
  28. cpuCFSQuota: true
  29. cpuManagerPolicy: none
  30. cpuManagerReconcilePeriod: 10s
  31. enableControllerAttachDetach: true
  32. enableDebuggingHandlers: true
  33. enforceNodeAllocatable:
  34. - pods
  35. eventBurst: 10
  36. eventRecordQPS: 5
  37. evictionHard:
  38. imagefs.available: 15%
  39. memory.available: 100Mi
  40. nodefs.available: 10%
  41. nodefs.inodesFree: 5%
  42. evictionPressureTransitionPeriod: 5m0s
  43. failSwapOn: true
  44. fileCheckFrequency: 20s
  45. hairpinMode: promiscuous-bridge
  46. healthzBindAddress: 127.0.0.1
  47. healthzPort: 10248
  48. httpCheckFrequency: 20s
  49. imageGCHighThresholdPercent: 85
  50. imageGCLowThresholdPercent: 80
  51. imageMinimumGCAge: 2m0s
  52. iptablesDropBit: 15
  53. iptablesMasqueradeBit: 14
  54. kubeAPIBurst: 10
  55. kubeAPIQPS: 5
  56. makeIPTablesUtilChains: true
  57. maxOpenFiles: 1000000
  58. maxPods: 110
  59. nodeStatusUpdateFrequency: 10s
  60. oomScoreAdj: -999
  61. podPidsLimit: -1
  62. registryBurst: 10
  63. registryPullQPS: 5
  64. resolvConf: /etc/resolv.conf
  65. rotateCertificates: true
  66. runtimeRequestTimeout: 2m0s
  67. serializeImagePulls: true
  68. staticPodPath: /etc/kubernetes/manifests
  69. streamingConnectionIdleTimeout: 4h0m0s
  70. syncFrequency: 1m0s
  71. volumeStatsAggPeriod: 1m0s
  72. EOF
  73. # 这是一个Kubelet的配置文件,用于配置Kubelet的各项参数。
  74. #
  75. # - apiVersion: kubelet.config.k8s.io/v1beta1:指定了配置文件的API版本为kubelet.config.k8s.io/v1beta1。
  76. # - kind: KubeletConfiguration:指定了配置类别为KubeletConfiguration。
  77. # - address: 0.0.0.0:指定了Kubelet监听的地址为0.0.0.0。
  78. # - port: 10250:指定了Kubelet监听的端口为10250。
  79. # - readOnlyPort: 10255:指定了只读端口为10255,用于提供只读的状态信息。
  80. # - authentication:指定了认证相关的配置信息。
  81. # - anonymous.enabled: false:禁用了匿名认证。
  82. # - webhook.enabled: true:启用了Webhook认证。
  83. # - x509.clientCAFile: /etc/kubernetes/pki/ca.pem:指定了X509证书的客户端CA文件路径。
  84. # - authorization:指定了授权相关的配置信息。
  85. # - mode: Webhook:指定了授权模式为Webhook。
  86. # - webhook.cacheAuthorizedTTL: 5m0s:指定了授权缓存时间段为5分钟。
  87. # - webhook.cacheUnauthorizedTTL: 30s:指定了未授权缓存时间段为30秒。
  88. # - cgroupDriver: systemd:指定了Cgroup驱动为systemd。
  89. # - cgroupsPerQOS: true:启用了每个QoS类别一个Cgroup的设置。
  90. # - clusterDNS: 指定了集群的DNS服务器地址列表。
  91. # - 10.96.0.10:指定了DNS服务器地址为10.96.0.10。
  92. # - clusterDomain: cluster.local:指定了集群的域名后缀为cluster.local。
  93. # - containerLogMaxFiles: 5:指定了容器日志文件保留的最大数量为5个。
  94. # - containerLogMaxSize: 10Mi:指定了容器日志文件的最大大小为10Mi。
  95. # - contentType: application/vnd.kubernetes.protobuf:指定了内容类型为protobuf。
  96. # - cpuCFSQuota: true:启用了CPU CFS Quota。
  97. # - cpuManagerPolicy: none:禁用了CPU Manager。
  98. # - cpuManagerReconcilePeriod: 10s:指定了CPU管理器的调整周期为10秒。
  99. # - enableControllerAttachDetach: true:启用了控制器的挂载和拆卸。
  100. # - enableDebuggingHandlers: true:启用了调试处理程序。
  101. # - enforceNodeAllocatable: 指定了强制节点可分配资源的列表。
  102. # - pods:强制节点可分配pods资源。
  103. # - eventBurst: 10:指定了事件突发的最大数量为10。
  104. # - eventRecordQPS: 5:指定了事件记录的最大请求量为5。
  105. # - evictionHard: 指定了驱逐硬性限制参数的配置信息。
  106. # - imagefs.available: 15%:指定了镜像文件系统可用空间的限制为15%。
  107. # - memory.available: 100Mi:指定了可用内存的限制为100Mi。
  108. # - nodefs.available: 10%:指定了节点文件系统可用空间的限制为10%。
  109. # - nodefs.inodesFree: 5%:指定了节点文件系统可用inode的限制为5%。
  110. # - evictionPressureTransitionPeriod: 5m0s:指定了驱逐压力转换的时间段为5分钟。
  111. # - failSwapOn: true:指定了在发生OOM时禁用交换分区。
  112. # - fileCheckFrequency: 20s:指定了文件检查频率为20秒。
  113. # - hairpinMode: promiscuous-bridge:设置了Hairpin Mode为"promiscuous-bridge"。
  114. # - healthzBindAddress: 127.0.0.1:指定了健康检查的绑定地址为127.0.0.1。
  115. # - healthzPort: 10248:指定了健康检查的端口为10248。
  116. # - httpCheckFrequency: 20s:指定了HTTP检查的频率为20秒。
  117. # - imageGCHighThresholdPercent: 85:指定了镜像垃圾回收的上阈值为85%。
  118. # - imageGCLowThresholdPercent: 80:指定了镜像垃圾回收的下阈值为80%。
  119. # - imageMinimumGCAge: 2m0s:指定了镜像垃圾回收的最小时间为2分钟。
  120. # - iptablesDropBit: 15:指定了iptables的Drop Bit为15。
  121. # - iptablesMasqueradeBit: 14:指定了iptables的Masquerade Bit为14。
  122. # - kubeAPIBurst: 10:指定了KubeAPI的突发请求数量为10个。
  123. # - kubeAPIQPS: 5:指定了KubeAPI的每秒请求频率为5个。
  124. # - makeIPTablesUtilChains: true:指定了是否使用iptables工具链。
  125. # - maxOpenFiles: 1000000:指定了最大打开文件数为1000000。
  126. # - maxPods: 110:指定了最大的Pod数量为110。
  127. # - nodeStatusUpdateFrequency: 10s:指定了节点状态更新的频率为10秒。
  128. # - oomScoreAdj: -999:指定了OOM Score Adjustment为-999。
  129. # - podPidsLimit: -1:指定了Pod的PID限制为-1,表示无限制。
  130. # - registryBurst: 10:指定了Registry的突发请求数量为10个。
  131. # - registryPullQPS: 5:指定了Registry的每秒拉取请求数量为5个。
  132. # - resolvConf: /etc/resolv.conf:指定了resolv.conf的文件路径。
  133. # - rotateCertificates: true:指定了是否轮转证书。
  134. # - runtimeRequestTimeout: 2m0s:指定了运行时请求的超时时间为2分钟。
  135. # - serializeImagePulls: true:指定了是否序列化镜像拉取。
  136. # - staticPodPath: /etc/kubernetes/manifests:指定了静态Pod的路径。
  137. # - streamingConnectionIdleTimeout: 4h0m0s:指定了流式连接的空闲超时时间为4小时。
  138. # - syncFrequency: 1m0s:指定了同步频率为1分钟。
  139. # - volumeStatsAggPeriod: 1m0s:指定了卷统计聚合周期为1分钟。

8.2.4启动kubelet

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now kubelet.service
  4. # 启用并立即启动kubelet.service单元。kubelet.service是kubelet守护进程的systemd服务单元。
  5. systemctl restart kubelet.service
  6. # 重启kubelet.service单元,即重新启动kubelet守护进程。
  7. systemctl status kubelet.service
  8. # kubelet.service单元的当前状态,包括运行状态、是否启用等信息。

8.2.5查看集群

  1. [root@k8s-master01 ~]# kubectl get node
  2. NAME STATUS ROLES AGE VERSION
  3. k8s-master01 Ready <none> 16s v1.29.2
  4. k8s-master02 Ready <none> 13s v1.29.2
  5. k8s-master03 Ready <none> 12s v1.29.2
  6. k8s-node01 Ready <none> 10s v1.29.2
  7. k8s-node02 Ready <none> 9s v1.29.2
  8. [root@k8s-master01 ~]#

8.2.6查看容器运行时

  1. [root@k8s-master01 ~]# kubectl describe node | grep Runtime
  2. Container Runtime Version: containerd://1.7.13
  3. Container Runtime Version: containerd://1.7.13
  4. Container Runtime Version: containerd://1.7.13
  5. Container Runtime Version: containerd://1.7.13
  6. Container Runtime Version: containerd://1.7.13
  7. [root@k8s-master01 ~]# kubectl describe node | grep Runtime
  8. Container Runtime Version: docker://25.0.3
  9. Container Runtime Version: docker://25.0.3
  10. Container Runtime Version: docker://25.0.3
  11. Container Runtime Version: docker://25.0.3
  12. Container Runtime Version: docker://25.0.3

8.3.kube-proxy配置

8.3.1将kubeconfig发送至其他节点

  1. # master-1执行
  2. for NODE in k8s-master02 k8s-master03 k8s-node01 k8s-node02; do scp /etc/kubernetes/kube-proxy.kubeconfig $NODE:/etc/kubernetes/kube-proxy.kubeconfig; done

8.3.2所有k8s节点添加kube-proxy的service文件

  1. cat > /usr/lib/systemd/system/kube-proxy.service << EOF
  2. [Unit]
  3. Description=Kubernetes Kube Proxy
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. After=network.target
  6. [Service]
  7. ExecStart=/usr/local/bin/kube-proxy \ --config=/etc/kubernetes/kube-proxy.yaml \ --cluster-cidr=172.16.0.0/12,fc00:2222::/112 \ --v=2
  8. Restart=always
  9. RestartSec=10s
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
  13. # 这是一个 systemd 服务单元文件的示例,用于配置 Kubernetes Kube Proxy 服务。下面是对其中一些字段的详细解释:
  14. #
  15. # [Unit]
  16. #
  17. # Description: 描述了该服务单元的用途,这里是 Kubernetes Kube Proxy。
  18. # Documentation: 指定了该服务单元的文档地址,即 https://github.com/kubernetes/kubernetes。
  19. # After: 指定该服务单元应在 network.target(网络目标)之后启动。
  20. # [Service]
  21. #
  22. # ExecStart: 指定了启动 Kube Proxy 服务的命令。通过 /usr/local/bin/kube-proxy 命令启动,并指定了配置文件的路径为 /etc/kubernetes/kube-proxy.yaml,同时指定了日志级别为 2。
  23. # Restart: 配置了服务在失败或退出后自动重启。
  24. # RestartSec: 配置了重启间隔,这里是每次重启之间的等待时间为 10 秒。
  25. # [Install]
  26. #
  27. # WantedBy: 指定了该服务单元的安装目标为 multi-user.target(多用户目标),表示该服务将在多用户模式下启动。
  28. # 通过配置这些字段,你可以启动和管理 Kubernetes Kube Proxy 服务。请注意,你需要根据实际情况修改 ExecStart 中的路径和文件名,确保与你的环境一致。另外,可以根据需求修改其他字段的值,以满足你的特定要求。

8.3.3所有k8s节点添加kube-proxy的配置

  1. cat > /etc/kubernetes/kube-proxy.yaml << EOF
  2. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  3. bindAddress: 0.0.0.0
  4. clientConnection:
  5. acceptContentTypes: ""
  6. burst: 10
  7. contentType: application/vnd.kubernetes.protobuf
  8. kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
  9. qps: 5
  10. clusterCIDR: 172.16.0.0/12,fc00:2222::/112
  11. configSyncPeriod: 15m0s
  12. conntrack:
  13. max: null
  14. maxPerCore: 32768
  15. min: 131072
  16. tcpCloseWaitTimeout: 1h0m0s
  17. tcpEstablishedTimeout: 24h0m0s
  18. enableProfiling: false
  19. healthzBindAddress: 0.0.0.0:10256
  20. hostnameOverride: ""
  21. iptables:
  22. masqueradeAll: false
  23. masqueradeBit: 14
  24. minSyncPeriod: 0s
  25. syncPeriod: 30s
  26. ipvs:
  27. masqueradeAll: true
  28. minSyncPeriod: 5s
  29. scheduler: "rr"
  30. syncPeriod: 30s
  31. kind: KubeProxyConfiguration
  32. metricsBindAddress: 127.0.0.1:10249
  33. mode: "ipvs"
  34. nodePortAddresses: null
  35. oomScoreAdj: -999
  36. portRange: ""
  37. udpIdleTimeout: 250ms
  38. EOF
  39. # 这是一个Kubernetes的kube-proxy组件配置文件示例。以下是每个配置项的详细解释:
  40. #
  41. # 1. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  42. # - 指定该配置文件的API版本。
  43. #
  44. # 2. bindAddress: 0.0.0.0
  45. # - 指定kube-proxy使用的监听地址。0.0.0.0表示监听所有网络接口。
  46. #
  47. # 3. clientConnection:
  48. # - 客户端连接配置项。
  49. #
  50. # a. acceptContentTypes: ""
  51. # - 指定接受的内容类型。
  52. #
  53. # b. burst: 10
  54. # - 客户端请求超出qps设置时的最大突发请求数。
  55. #
  56. # c. contentType: application/vnd.kubernetes.protobuf
  57. # - 指定客户端请求的内容类型。
  58. #
  59. # d. kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
  60. # - kube-proxy使用的kubeconfig文件路径。
  61. #
  62. # e. qps: 5
  63. # - 每秒向API服务器发送的请求数量。
  64. #
  65. # 4. clusterCIDR: 172.16.0.0/12,fc00:2222::/112
  66. # - 指定集群使用的CIDR范围,用于自动分配Pod IP。
  67. #
  68. # 5. configSyncPeriod: 15m0s
  69. # - 指定kube-proxy配置同步到节点的频率。
  70. #
  71. # 6. conntrack:
  72. # - 连接跟踪设置。
  73. #
  74. # a. max: null
  75. # - 指定连接跟踪的最大值。
  76. #
  77. # b. maxPerCore: 32768
  78. # - 指定每个核心的最大连接跟踪数。
  79. #
  80. # c. min: 131072
  81. # - 指定最小的连接跟踪数。
  82. #
  83. # d. tcpCloseWaitTimeout: 1h0m0s
  84. # - 指定处于CLOSE_WAIT状态的TCP连接的超时时间。
  85. #
  86. # e. tcpEstablishedTimeout: 24h0m0s
  87. # - 指定已建立的TCP连接的超时时间。
  88. #
  89. # 7. enableProfiling: false
  90. # - 是否启用性能分析。
  91. #
  92. # 8. healthzBindAddress: 0.0.0.0:10256
  93. # - 指定健康检查监听地址和端口。
  94. #
  95. # 9. hostnameOverride: ""
  96. # - 指定覆盖默认主机名的值。
  97. #
  98. # 10. iptables:
  99. # - iptables设置。
  100. #
  101. # a. masqueradeAll: false
  102. # - 是否对所有流量使用IP伪装。
  103. #
  104. # b. masqueradeBit: 14
  105. # - 指定伪装的Bit标记。
  106. #
  107. # c. minSyncPeriod: 0s
  108. # - 指定同步iptables规则的最小间隔。
  109. #
  110. # d. syncPeriod: 30s
  111. # - 指定同步iptables规则的时间间隔。
  112. #
  113. # 11. ipvs:
  114. # - ipvs设置。
  115. #
  116. # a. masqueradeAll: true
  117. # - 是否对所有流量使用IP伪装。
  118. #
  119. # b. minSyncPeriod: 5s
  120. # - 指定同步ipvs规则的最小间隔。
  121. #
  122. # c. scheduler: "rr"
  123. # - 指定ipvs默认使用的调度算法。
  124. #
  125. # d. syncPeriod: 30s
  126. # - 指定同步ipvs规则的时间间隔。
  127. #
  128. # 12. kind: KubeProxyConfiguration
  129. # - 指定该配置文件的类型。
  130. #
  131. # 13. metricsBindAddress: 127.0.0.1:10249
  132. # - 指定指标绑定的地址和端口。
  133. #
  134. # 14. mode: "ipvs"
  135. # - 指定kube-proxy的模式。这里指定为ipvs,使用IPVS代理模式。
  136. #
  137. # 15. nodePortAddresses: null
  138. # - 指定可用于NodePort的网络地址。
  139. #
  140. # 16. oomScoreAdj: -999
  141. # - 指定kube-proxy的OOM优先级。
  142. #
  143. # 17. portRange: ""
  144. # - 指定可用于服务端口范围。
  145. #
  146. # 18. udpIdleTimeout: 250ms
  147. # - 指定UDP连接的空闲超时时间。

8.3.4启动kube-proxy

  1. systemctl daemon-reload
  2. # 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
  3. systemctl enable --now kube-proxy.service
  4. # 启用并立即启动kube-proxy.service单元。kube-proxy.service是kube-proxy守护进程的systemd服务单元。
  5. systemctl restart kube-proxy.service
  6. # 重启kube-proxy.service单元,即重新启动kube-proxy守护进程。
  7. systemctl status kube-proxy.service
  8. # kube-proxy.service单元的当前状态,包括运行状态、是否启用等信息。

9.安装网络插件

注意 9.1 和 9.2 二选其一即可,建议在此处创建好快照后在进行操作,后续出问题可以回滚

** centos7 要升级libseccomp 不然 无法安装网络插件**

  1. # https://github.com/opencontainers/runc/releases
  2. # 升级runc
  3. # wget https://mirrors.chenby.cn/https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
  4. install -m 755 runc.amd64 /usr/local/sbin/runc
  5. cp -p /usr/local/sbin/runc /usr/local/bin/runc
  6. cp -p /usr/local/sbin/runc /usr/bin/runc
  7. #下载高于2.4以上的包
  8. yum -y install http://rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
  9. # 清华源
  10. yum -y install https://mirrors.tuna.tsinghua.edu.cn/centos/8-stream/BaseOS/x86_64/os/Packages/libseccomp-2.5.1-1.el8.x86_64.rpm
  11. #查看当前版本
  12. [root@k8s-master-1 ~]# rpm -qa | grep libseccomp
  13. libseccomp-2.5.1-1.el8.x86_64

9.1安装Calico

9.1.1更改calico网段

  1. wget https://mirrors.chenby.cn/https://github.com/projectcalico/calico/blob/master/manifests/calico-typha.yaml
  2. cp calico-typha.yaml calico.yaml
  3. cp calico-typha.yaml calico-ipv6.yaml
  4. vim calico.yaml
  5. # calico-config ConfigMap处
  6. "ipam": {
  7. "type": "calico-ipam",
  8. },
  9. - name: IP
  10. value: "autodetect"
  11. - name: CALICO_IPV4POOL_CIDR
  12. value: "172.16.0.0/12"
  13. # vim calico-ipv6.yaml
  14. # calico-config ConfigMap处
  15. "ipam": {
  16. "type": "calico-ipam",
  17. "assign_ipv4": "true",
  18. "assign_ipv6": "true"
  19. },
  20. - name: IP
  21. value: "autodetect"
  22. - name: IP6
  23. value: "autodetect"
  24. - name: CALICO_IPV4POOL_CIDR
  25. value: "172.16.0.0/12"
  26. - name: CALICO_IPV6POOL_CIDR
  27. value: "fc00:2222::/112"
  28. - name: FELIX_IPV6SUPPORT
  29. value: "true"
  30. # 若docker镜像拉不下来,可以使用国内的仓库
  31. sed -i "s#docker.io/calico/#m.daocloud.io/docker.io/calico/#g" calico.yaml
  32. sed -i "s#docker.io/calico/#m.daocloud.io/docker.io/calico/#g" calico-ipv6.yaml
  33. sed -i "s#m.daocloud.io/docker.io/calico/#docker.io/calico/#g" calico.yaml
  34. sed -i "s#m.daocloud.io/docker.io/calico/#docker.io/calico/#g" calico-ipv6.yaml
  35. # 本地没有公网 IPv6 使用 calico.yaml
  36. kubectl apply -f calico.yaml
  37. # 本地有公网 IPv6 使用 calico-ipv6.yaml
  38. # kubectl apply -f calico-ipv6.yaml

9.1.2查看容器状态

  1. # calico 初始化会很慢 需要耐心等待一下,大约十分钟左右
  2. [root@k8s-master01 ~]# kubectl get pod -A
  3. NAMESPACE NAME READY STATUS RESTARTS AGE
  4. kube-system calico-kube-controllers-6747f75cdc-fbvvc 1/1 Running 0 61s
  5. kube-system calico-node-fs7hl 1/1 Running 0 61s
  6. kube-system calico-node-jqz58 1/1 Running 0 61s
  7. kube-system calico-node-khjlg 1/1 Running 0 61s
  8. kube-system calico-node-wmf8q 1/1 Running 0 61s
  9. kube-system calico-node-xc6gn 1/1 Running 0 61s
  10. kube-system calico-typha-6cdc4b4fbc-57snb 1/1 Running 0 61s

9.2 安装cilium

9.2.1 安装helm

  1. # [root@k8s-master01 ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
  2. # [root@k8s-master01 ~]# chmod 700 get_helm.sh
  3. # [root@k8s-master01 ~]# ./get_helm.sh
  4. # wget https://mirrors.huaweicloud.com/helm/v3.13.2/helm-v3.13.2-linux-amd64.tar.gz
  5. tar xvf helm-*-linux-amd64.tar.gz
  6. cp linux-amd64/helm /usr/local/bin/

9.2.2 安装cilium

  1. # 添加源
  2. helm repo add cilium https://helm.cilium.io
  3. # 修改为国内源
  4. helm pull cilium/cilium
  5. tar xvf cilium-*.tgz
  6. cd cilium/
  7. sed -i "s#quay.io/#m.daocloud.io/quay.io/#g" values.yaml
  8. # 默认参数安装
  9. helm install cilium ./cilium/ -n kube-system
  10. # 启用ipv6
  11. # helm install cilium cilium/cilium --namespace kube-system --set ipv6.enabled=true
  12. # 启用路由信息和监控插件
  13. # helm install cilium cilium/cilium --namespace kube-system --set hubble.relay.enabled=true --set hubble.ui.enabled=true --set prometheus.enabled=true --set operator.prometheus.enabled=true --set hubble.enabled=true --set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}"

9.2.3 查看

  1. [root@k8s-master01 ~]# kubectl get pod -A | grep cil
  2. kube-system cilium-gmr6c 1/1 Running 0 5m3s
  3. kube-system cilium-kzgdj 1/1 Running 0 5m3s
  4. kube-system cilium-operator-69b677f97c-6pw4k 1/1 Running 0 5m3s
  5. kube-system cilium-operator-69b677f97c-xzzdk 1/1 Running 0 5m3s
  6. kube-system cilium-q2rnr 1/1 Running 0 5m3s
  7. kube-system cilium-smx5v 1/1 Running 0 5m3s
  8. kube-system cilium-tdjq4 1/1 Running 0 5m3s
  9. [root@k8s-master01 ~]#

9.2.4 下载专属监控面板

安装时候没有创建 监控可以忽略

  1. [root@k8s-master01 yaml]# wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/1.12.1/examples/kubernetes/addons/prometheus/monitoring-example.yaml
  2. [root@k8s-master01 yaml]# sed -i "s#docker.io/#m.daocloud.io/docker.io/#g" monitoring-example.yaml
  3. [root@k8s-master01 yaml]# kubectl apply -f monitoring-example.yaml
  4. namespace/cilium-monitoring created
  5. serviceaccount/prometheus-k8s created
  6. configmap/grafana-config created
  7. configmap/grafana-cilium-dashboard created
  8. configmap/grafana-cilium-operator-dashboard created
  9. configmap/grafana-hubble-dashboard created
  10. configmap/prometheus created
  11. clusterrole.rbac.authorization.k8s.io/prometheus created
  12. clusterrolebinding.rbac.authorization.k8s.io/prometheus created
  13. service/grafana created
  14. service/prometheus created
  15. deployment.apps/grafana created
  16. deployment.apps/prometheus created
  17. [root@k8s-master01 yaml]#

9.2.5 下载部署测试用例

说明 测试用例 需要在 安装CoreDNS 之后即可完成

  1. wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/cilium/cilium/master/examples/kubernetes/connectivity-check/connectivity-check.yaml
  2. sed -i "s#google.com#baidu.cn#g" connectivity-check.yaml
  3. sed -i "s#quay.io/#m.daocloud.io/quay.io/#g" connectivity-check.yaml
  4. kubectl apply -f connectivity-check.yaml

9.2.6 查看pod

  1. [root@k8s-master01 yaml]# kubectl get pod -A
  2. NAMESPACE NAME READY STATUS RESTARTS AGE
  3. cilium-monitoring grafana-59957b9549-6zzqh 1/1 Running 0 10m
  4. cilium-monitoring prometheus-7c8c9684bb-4v9cl 1/1 Running 0 10m
  5. default chenby-75b5d7fbfb-7zjsr 1/1 Running 0 27h
  6. default chenby-75b5d7fbfb-hbvr8 1/1 Running 0 27h
  7. default chenby-75b5d7fbfb-ppbzg 1/1 Running 0 27h
  8. default echo-a-6799dff547-pnx6w 1/1 Running 0 10m
  9. default echo-b-fc47b659c-4bdg9 1/1 Running 0 10m
  10. default echo-b-host-67fcfd59b7-28r9s 1/1 Running 0 10m
  11. default host-to-b-multi-node-clusterip-69c57975d6-z4j2z 1/1 Running 0 10m
  12. default host-to-b-multi-node-headless-865899f7bb-frrmc 1/1 Running 0 10m
  13. default pod-to-a-allowed-cnp-5f9d7d4b9d-hcd8x 1/1 Running 0 10m
  14. default pod-to-a-denied-cnp-65cc5ff97b-2rzb8 1/1 Running 0 10m
  15. default pod-to-a-dfc64f564-p7xcn 1/1 Running 0 10m
  16. default pod-to-b-intra-node-nodeport-677868746b-trk2l 1/1 Running 0 10m
  17. default pod-to-b-multi-node-clusterip-76bbbc677b-knfq2 1/1 Running 0 10m
  18. default pod-to-b-multi-node-headless-698c6579fd-mmvd7 1/1 Running 0 10m
  19. default pod-to-b-multi-node-nodeport-5dc4b8cfd6-8dxmz 1/1 Running 0 10m
  20. default pod-to-external-1111-8459965778-pjt9b 1/1 Running 0 10m
  21. default pod-to-external-fqdn-allow-google-cnp-64df9fb89b-l9l4q 1/1 Running 0 10m
  22. kube-system cilium-7rfj6 1/1 Running 0 56s
  23. kube-system cilium-d4cch 1/1 Running 0 56s
  24. kube-system cilium-h5x8r 1/1 Running 0 56s
  25. kube-system cilium-operator-5dbddb6dbf-flpl5 1/1 Running 0 56s
  26. kube-system cilium-operator-5dbddb6dbf-gcznc 1/1 Running 0 56s
  27. kube-system cilium-t2xlz 1/1 Running 0 56s
  28. kube-system cilium-z65z7 1/1 Running 0 56s
  29. kube-system coredns-665475b9f8-jkqn8 1/1 Running 1 (36h ago) 36h
  30. kube-system hubble-relay-59d8575-9pl9z 1/1 Running 0 56s
  31. kube-system hubble-ui-64d4995d57-nsv9j 2/2 Running 0 56s
  32. kube-system metrics-server-776f58c94b-c6zgs 1/1 Running 1 (36h ago) 37h
  33. [root@k8s-master01 yaml]#

9.2.7 修改为NodePort

安装时候没有创建 监控可以忽略

  1. [root@k8s-master01 yaml]# kubectl edit svc -n kube-system hubble-ui
  2. service/hubble-ui edited
  3. [root@k8s-master01 yaml]#
  4. [root@k8s-master01 yaml]# kubectl edit svc -n cilium-monitoring grafana
  5. service/grafana edited
  6. [root@k8s-master01 yaml]#
  7. [root@k8s-master01 yaml]# kubectl edit svc -n cilium-monitoring prometheus
  8. service/prometheus edited
  9. [root@k8s-master01 yaml]#
  10. type: NodePort

9.2.8 查看端口

安装时候没有创建 监控可以忽略

  1. [root@k8s-master01 yaml]# kubectl get svc -A | grep monit
  2. cilium-monitoring grafana NodePort 10.100.250.17 <none> 3000:30707/TCP 15m
  3. cilium-monitoring prometheus NodePort 10.100.131.243 <none> 9090:31155/TCP 15m
  4. [root@k8s-master01 yaml]#
  5. [root@k8s-master01 yaml]# kubectl get svc -A | grep hubble
  6. kube-system hubble-metrics ClusterIP None <none> 9965/TCP 5m12s
  7. kube-system hubble-peer ClusterIP 10.100.150.29 <none> 443/TCP 5m12s
  8. kube-system hubble-relay ClusterIP 10.109.251.34 <none> 80/TCP 5m12s
  9. kube-system hubble-ui NodePort 10.102.253.59 <none> 80:31219/TCP 5m12s
  10. [root@k8s-master01 yaml]#

9.2.9 访问

安装时候没有创建 监控可以忽略

  1. http://192.168.1.31:30707
  2. http://192.168.1.31:31155
  3. http://192.168.1.31:31219

10.安装CoreDNS

10.1以下步骤只在master01操作

10.1.1修改文件

  1. # 下载tgz包
  2. helm repo add coredns https://coredns.github.io/helm
  3. helm pull coredns/coredns
  4. tar xvf coredns-*.tgz
  5. cd coredns/
  6. # 修改IP地址
  7. vim values.yaml
  8. cat values.yaml | grep clusterIP:
  9. clusterIP: "10.96.0.10"
  10. # 示例
  11. ---
  12. service:
  13. # clusterIP: ""
  14. # clusterIPs: []
  15. # loadBalancerIP: ""
  16. # externalIPs: []
  17. # externalTrafficPolicy: ""
  18. # ipFamilyPolicy: ""
  19. # The name of the Service
  20. # If not set, a name is generated using the fullname template
  21. clusterIP: "10.96.0.10"
  22. name: ""
  23. annotations: {}
  24. ---
  25. # 修改为国内源 docker源可选
  26. sed -i "s#coredns/#m.daocloud.io/docker.io/coredns/#g" values.yaml
  27. sed -i "s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g" values.yaml
  28. # 默认参数安装
  29. helm install coredns ./coredns/ -n kube-system

11.安装Metrics Server

11.1以下步骤只在master01操作

11.1.1安装Metrics-server

在新版的Kubernetes中系统资源的采集均使用Metrics-server,可以通过Metrics采集节点和Pod的内存、磁盘、CPU和网络的使用率

  1. # 下载
  2. wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  3. # 修改配置
  4. vim components.yaml
  5. ---
  6. # 1
  7. - args:
  8. - --cert-dir=/tmp
  9. - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
  10. - --kubelet-use-node-status-port
  11. - --metric-resolution=15s
  12. - --kubelet-insecure-tls
  13. - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem
  14. - --requestheader-username-headers=X-Remote-User
  15. - --requestheader-group-headers=X-Remote-Group
  16. - --requestheader-extra-headers-prefix=X-Remote-Extra-
  17. # 2
  18. volumeMounts:
  19. - mountPath: /tmp
  20. name: tmp-dir
  21. - name: ca-ssl
  22. mountPath: /etc/kubernetes/pki
  23. # 3
  24. volumes:
  25. - emptyDir: {}
  26. name: tmp-dir
  27. - name: ca-ssl
  28. hostPath:
  29. path: /etc/kubernetes/pki
  30. ---
  31. # 修改为国内源 docker源可选
  32. sed -i "s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g" *.yaml
  33. # 执行部署
  34. kubectl apply -f components.yaml

11.1.2稍等片刻查看状态

  1. kubectl top node
  2. NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
  3. k8s-master01 268m 6% 2318Mi 60%
  4. k8s-master02 147m 3% 1802Mi 47%
  5. k8s-master03 147m 3% 1820Mi 47%
  6. k8s-node01 62m 1% 1152Mi 30%
  7. k8s-node02 63m 1% 1114Mi 29%

12.集群验证

12.1部署pod资源

  1. cat<<EOF | kubectl apply -f -
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: busybox
  6. namespace: default
  7. spec:
  8. containers:
  9. - name: busybox
  10. image: docker.io/library/busybox:1.28
  11. command:
  12. - sleep
  13. - "3600"
  14. imagePullPolicy: IfNotPresent
  15. restartPolicy: Always
  16. EOF
  17. # 查看
  18. kubectl get pod
  19. NAME READY STATUS RESTARTS AGE
  20. busybox 1/1 Running 0 17s

12.2用pod解析默认命名空间中的kubernetes

  1. # 查看name
  2. kubectl get svc
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
  5. # 进行解析
  6. kubectl exec busybox -n default -- nslookup kubernetes
  7. 3Server: 10.96.0.10
  8. Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
  9. Name: kubernetes
  10. Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

12.3测试跨命名空间是否可以解析

  1. # 查看有那些name
  2. kubectl get svc -A
  3. NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 76m
  5. kube-system calico-typha ClusterIP 10.105.100.82 <none> 5473/TCP 35m
  6. kube-system coredns-coredns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 8m14s
  7. kube-system metrics-server ClusterIP 10.105.60.31 <none> 443/TCP 109s
  8. # 进行解析
  9. kubectl exec busybox -n default -- nslookup coredns-coredns.kube-system
  10. Server: 10.96.0.10
  11. Address 1: 10.96.0.10 coredns-coredns.kube-system.svc.cluster.local
  12. Name: coredns-coredns.kube-system
  13. Address 1: 10.96.0.10 coredns-coredns.kube-system.svc.cluster.local
  14. [root@k8s-master01 metrics-server]#

12.4每个节点都必须要能访问Kubernetes的kubernetes svc 443和kube-dns的service 53

  1. telnet 10.96.0.1 443
  2. Trying 10.96.0.1...
  3. Connected to 10.96.0.1.
  4. Escape character is '^]'.
  5. telnet 10.96.0.10 53
  6. Trying 10.96.0.10...
  7. Connected to 10.96.0.10.
  8. Escape character is '^]'.
  9. curl 10.96.0.10:53
  10. curl: (52) Empty reply from server

12.5Pod和Pod之前要能通

  1. kubectl get po -owide
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. busybox 1/1 Running 0 17m 172.27.14.193 k8s-node02 <none> <none>
  4. kubectl get po -n kube-system -owide
  5. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  6. calico-kube-controllers-76754ff848-pw4xg 1/1 Running 0 38m 172.25.244.193 k8s-master01 <none> <none>
  7. calico-node-97m55 1/1 Running 0 38m 192.168.1.34 k8s-node01 <none> <none>
  8. calico-node-hlz7j 1/1 Running 0 38m 192.168.1.32 k8s-master02 <none> <none>
  9. calico-node-jtlck 1/1 Running 0 38m 192.168.1.33 k8s-master03 <none> <none>
  10. calico-node-lxfkf 1/1 Running 0 38m 192.168.1.35 k8s-node02 <none> <none>
  11. calico-node-t667x 1/1 Running 0 38m 192.168.1.31 k8s-master01 <none> <none>
  12. calico-typha-59d75c5dd4-gbhfp 1/1 Running 0 38m 192.168.1.35 k8s-node02 <none> <none>
  13. coredns-coredns-c5c6d4d9b-bd829 1/1 Running 0 10m 172.25.92.65 k8s-master02 <none> <none>
  14. metrics-server-7c8b55c754-w7q8v 1/1 Running 0 3m56s 172.17.125.3 k8s-node01 <none> <none>
  15. # 进入busybox ping其他节点上的pod
  16. kubectl exec -ti busybox -- sh
  17. / # ping 192.168.1.34
  18. PING 192.168.1.34 (192.168.1.34): 56 data bytes
  19. 64 bytes from 192.168.1.34: seq=0 ttl=63 time=0.358 ms
  20. 64 bytes from 192.168.1.34: seq=1 ttl=63 time=0.668 ms
  21. 64 bytes from 192.168.1.34: seq=2 ttl=63 time=0.637 ms
  22. 64 bytes from 192.168.1.34: seq=3 ttl=63 time=0.624 ms
  23. 64 bytes from 192.168.1.34: seq=4 ttl=63 time=0.907 ms
  24. # 可以连通证明这个pod是可以跨命名空间和跨主机通信的

12.6创建三个副本,可以看到3个副本分布在不同的节点上(用完可以删了)

  1. cat<<EOF | kubectl apply -f -
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: nginx-deployment
  6. labels:
  7. app: nginx
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. app: nginx
  13. template:
  14. metadata:
  15. labels:
  16. app: nginx
  17. spec:
  18. containers:
  19. - name: nginx
  20. image: nginx
  21. ports:
  22. - containerPort: 80
  23. EOF
  24. kubectl get pod
  25. NAME READY STATUS RESTARTS AGE
  26. busybox 1/1 Running 0 6m25s
  27. nginx-deployment-9456bbbf9-4bmvk 1/1 Running 0 8s
  28. nginx-deployment-9456bbbf9-9rcdk 1/1 Running 0 8s
  29. nginx-deployment-9456bbbf9-dqv8s 1/1 Running 0 8s
  30. # 删除nginx
  31. [root@k8s-master01 ~]# kubectl delete deployments nginx-deployment

13.安装dashboard

  1. helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
  2. helm install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --namespace kube-system

13.1更改dashboard的svc为NodePort,如果已是请忽略

  1. kubectl edit svc kubernetes-dashboard -n kube-system
  2. type: NodePort

13.2查看端口号

  1. kubectl get svc kubernetes-dashboard -n kube-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes-dashboard NodePort 10.108.120.110 <none> 443:30034/TCP 34s

13.3创建token

  1. cat > dashboard-user.yaml << EOF
  2. apiVersion: v1
  3. kind: ServiceAccount
  4. metadata:
  5. name: admin-user
  6. namespace: kube-system
  7. ---
  8. apiVersion: rbac.authorization.k8s.io/v1
  9. kind: ClusterRoleBinding
  10. metadata:
  11. name: admin-user
  12. roleRef:
  13. apiGroup: rbac.authorization.k8s.io
  14. kind: ClusterRole
  15. name: cluster-admin
  16. subjects:
  17. - kind: ServiceAccount
  18. name: admin-user
  19. namespace: kube-system
  20. EOF
  21. kubectl apply -f dashboard-user.yaml
  22. # 创建token
  23. kubectl -n kube-system create token admin-user
  24. eyJhbGciOiJSUzI1NiIsImtpZCI6Im5vZExpNi1tTERLb09ONVM2cEE0SWNCUnA4eTZieE81RnVGb1IwSk5QVFEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzA4MjQ4NjM4LCJpYXQiOjE3MDgyNDUwMzgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiMTQ1YTdmZTktMTQ0YS00NDZmLWI1M2QtNDk4OGM3YjIyZjgyIn19LCJuYmYiOjE3MDgyNDUwMzgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTphZG1pbi11c2VyIn0.H2Oxxrb5BVLH1iDOA-Uo1I7aiAUZX1wK-xBiV9NJXQ32EDyQvss95yQbCNHtPMhQZ8jFE3NRhyjkgZMZmX7kR9J-89QXLqKhE8Qnihd1mq5HOEVQ8tjZ6ix8ymxs5QkfSvd_OUzILKBtfYAMb4Fer67Dyf14oBHWVKU9LQkCdtFaLxerK--N7gLWeGXzavqzOlEPZR5UZWUPwP5dJmAQtvSToPVMaKiA49LjaGJid0F5Pxnutr80oZRsLfKr0MpoEG6jrow1QeJ2PgVksDTcqMTpye-M6jmIbuxabsRSskTT_zEDT0J86BiLYIHnh79D-P7IUUq6GOp8DgG-wXhICQ

13.3登录dashboard

https://192.168.1.31:30034/

14.ingress安装

14.1执行部署

  1. wget https://mirrors.chenby.cn/https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
  2. # 修改为国内源 docker源可选
  3. sed -i "s#registry.k8s.io/#m.daocloud.io/registry.k8s.io/#g" *.yaml
  4. cat > backend.yaml << EOF
  5. apiVersion: apps/v1
  6. kind: Deployment
  7. metadata:
  8. name: default-http-backend
  9. labels:
  10. app.kubernetes.io/name: default-http-backend
  11. namespace: kube-system
  12. spec:
  13. replicas: 1
  14. selector:
  15. matchLabels:
  16. app.kubernetes.io/name: default-http-backend
  17. template:
  18. metadata:
  19. labels:
  20. app.kubernetes.io/name: default-http-backend
  21. spec:
  22. terminationGracePeriodSeconds: 60
  23. containers:
  24. - name: default-http-backend
  25. image: registry.cn-hangzhou.aliyuncs.com/chenby/defaultbackend-amd64:1.5
  26. livenessProbe:
  27. httpGet:
  28. path: /healthz
  29. port: 8080
  30. scheme: HTTP
  31. initialDelaySeconds: 30
  32. timeoutSeconds: 5
  33. ports:
  34. - containerPort: 8080
  35. resources:
  36. limits:
  37. cpu: 10m
  38. memory: 20Mi
  39. requests:
  40. cpu: 10m
  41. memory: 20Mi
  42. ---
  43. apiVersion: v1
  44. kind: Service
  45. metadata:
  46. name: default-http-backend
  47. namespace: kube-system
  48. labels:
  49. app.kubernetes.io/name: default-http-backend
  50. spec:
  51. ports:
  52. - port: 80
  53. targetPort: 8080
  54. selector:
  55. app.kubernetes.io/name: default-http-backend
  56. EOF
  57. kubectl apply -f deploy.yaml
  58. kubectl apply -f backend.yaml
  59. cat > ingress-demo-app.yaml << EOF
  60. apiVersion: apps/v1
  61. kind: Deployment
  62. metadata:
  63. name: hello-server
  64. spec:
  65. replicas: 2
  66. selector:
  67. matchLabels:
  68. app: hello-server
  69. template:
  70. metadata:
  71. labels:
  72. app: hello-server
  73. spec:
  74. containers:
  75. - name: hello-server
  76. image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/hello-server
  77. ports:
  78. - containerPort: 9000
  79. ---
  80. apiVersion: apps/v1
  81. kind: Deployment
  82. metadata:
  83. labels:
  84. app: nginx-demo
  85. name: nginx-demo
  86. spec:
  87. replicas: 2
  88. selector:
  89. matchLabels:
  90. app: nginx-demo
  91. template:
  92. metadata:
  93. labels:
  94. app: nginx-demo
  95. spec:
  96. containers:
  97. - image: nginx
  98. name: nginx
  99. ---
  100. apiVersion: v1
  101. kind: Service
  102. metadata:
  103. labels:
  104. app: nginx-demo
  105. name: nginx-demo
  106. spec:
  107. selector:
  108. app: nginx-demo
  109. ports:
  110. - port: 8000
  111. protocol: TCP
  112. targetPort: 80
  113. ---
  114. apiVersion: v1
  115. kind: Service
  116. metadata:
  117. labels:
  118. app: hello-server
  119. name: hello-server
  120. spec:
  121. selector:
  122. app: hello-server
  123. ports:
  124. - port: 8000
  125. protocol: TCP
  126. targetPort: 9000
  127. ---
  128. apiVersion: networking.k8s.io/v1
  129. kind: Ingress
  130. metadata:
  131. name: ingress-host-bar
  132. spec:
  133. ingressClassName: nginx
  134. rules:
  135. - host: "hello.chenby.cn"
  136. http:
  137. paths:
  138. - pathType: Prefix
  139. path: "/"
  140. backend:
  141. service:
  142. name: hello-server
  143. port:
  144. number: 8000
  145. - host: "demo.chenby.cn"
  146. http:
  147. paths:
  148. - pathType: Prefix
  149. path: "/nginx"
  150. backend:
  151. service:
  152. name: nginx-demo
  153. port:
  154. number: 8000
  155. EOF
  156. # 等创建完成后在执行:
  157. kubectl apply -f ingress-demo-app.yaml
  158. kubectl get ingress
  159. NAME CLASS HOSTS ADDRESS PORTS AGE
  160. ingress-host-bar nginx hello.chenby.cn,demo.chenby.cn 192.168.1.32 80 7s

14.2过滤查看ingress端口

  1. # 修改为nodeport
  2. kubectl edit svc -n ingress-nginx ingress-nginx-controller
  3. type: NodePort
  4. [root@hello ~/yaml]# kubectl get svc -A | grep ingress
  5. ingress-nginx ingress-nginx-controller NodePort 10.104.231.36 <none> 80:32636/TCP,443:30579/TCP 104s
  6. ingress-nginx ingress-nginx-controller-admission ClusterIP 10.101.85.88 <none> 443/TCP 105s
  7. [root@hello ~/yaml]#

15.IPv6测试

  1. #部署应用
  2. cat<<EOF | kubectl apply -f -
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. name: chenby
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: chenby
  12. template:
  13. metadata:
  14. labels:
  15. app: chenby
  16. spec:
  17. hostNetwork: true
  18. containers:
  19. - name: chenby
  20. image: docker.io/library/nginx
  21. resources:
  22. limits:
  23. memory: "128Mi"
  24. cpu: "500m"
  25. ports:
  26. - containerPort: 80
  27. ---
  28. apiVersion: v1
  29. kind: Service
  30. metadata:
  31. name: chenby
  32. spec:
  33. ipFamilyPolicy: PreferDualStack
  34. ipFamilies:
  35. - IPv6
  36. - IPv4
  37. type: NodePort
  38. selector:
  39. app: chenby
  40. ports:
  41. - port: 80
  42. targetPort: 80
  43. EOF
  44. #查看端口
  45. [root@k8s-master01 ~]# kubectl get svc
  46. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  47. chenby NodePort fd00:1111::bc86 <none> 80:31540/TCP 5s
  48. [root@k8s-master01 ~]#
  49. [root@localhost yaml]# curl -I http://192.168.1.31:31540
  50. HTTP/1.1 200 OK
  51. Server: nginx/1.21.6
  52. Date: Thu, 05 May 2022 10:20:59 GMT
  53. Content-Type: text/html
  54. Content-Length: 615
  55. Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
  56. Connection: keep-alive
  57. ETag: "61f01158-267"
  58. Accept-Ranges: bytes
  59. [root@localhost yaml]#
  60. [root@localhost yaml]# curl -I http://[2409:8a10:9e18:9020::10]:31540
  61. HTTP/1.1 200 OK
  62. Server: nginx/1.21.6
  63. Date: Thu, 05 May 2022 10:20:54 GMT
  64. Content-Type: text/html
  65. Content-Length: 615
  66. Last-Modified: Tue, 25 Jan 2022 15:03:52 GMT
  67. Connection: keep-alive
  68. ETag: "61f01158-267"
  69. Accept-Ranges: bytes

16.安装命令行自动补全功能

  1. yum install bash-completion -y
  2. source /usr/share/bash-completion/bash_completion
  3. source <(kubectl completion bash)
  4. echo "source <(kubectl completion bash)" >> ~/.bashrc

附录

  1. # 镜像加速器可以使用DaoCloud仓库,替换规则如下
  2. cr.l5d.io/ ===> m.daocloud.io/cr.l5d.io/
  3. docker.elastic.co/ ===> m.daocloud.io/docker.elastic.co/
  4. docker.io/ ===> m.daocloud.io/docker.io/
  5. gcr.io/ ===> m.daocloud.io/gcr.io/
  6. ghcr.io/ ===> m.daocloud.io/ghcr.io/
  7. k8s.gcr.io/ ===> m.daocloud.io/k8s.gcr.io/
  8. mcr.microsoft.com/ ===> m.daocloud.io/mcr.microsoft.com/
  9. nvcr.io/ ===> m.daocloud.io/nvcr.io/
  10. quay.io/ ===> m.daocloud.io/quay.io/
  11. registry.jujucharms.com/ ===> m.daocloud.io/registry.jujucharms.com/
  12. registry.k8s.io/ ===> m.daocloud.io/registry.k8s.io/
  13. registry.opensource.zalan.do/ ===> m.daocloud.io/registry.opensource.zalan.do/
  14. rocks.canonical.com/ ===> m.daocloud.io/rocks.canonical.com/
  15. # 镜像版本要自行查看,因为镜像版本是随时更新的,文档无法做到实时更新
  16. # docker pull 镜像
  17. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/cni:master
  18. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/node:master
  19. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/kube-controllers:master
  20. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/typha:master
  21. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/coredns:v1.10.0
  22. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/pause:3.6
  23. docker pull registry.cn-hangzhou.aliyuncs.com/chenby/metrics-server:v0.5.2
  24. docker pull kubernetesui/dashboard:v2.7.0
  25. docker pull kubernetesui/metrics-scraper:v1.0.8
  26. docker pull quay.io/cilium/cilium:v1.12.6
  27. docker pull quay.io/cilium/certgen:v0.1.8
  28. docker pull quay.io/cilium/hubble-relay:v1.12.6
  29. docker pull quay.io/cilium/hubble-ui-backend:v0.9.2
  30. docker pull quay.io/cilium/hubble-ui:v0.9.2
  31. docker pull quay.io/cilium/cilium-etcd-operator:v2.0.7
  32. docker pull quay.io/cilium/operator:v1.12.6
  33. docker pull quay.io/cilium/clustermesh-apiserver:v1.12.6
  34. docker pull quay.io/coreos/etcd:v3.5.4
  35. docker pull quay.io/cilium/startup-script:d69851597ea019af980891a4628fb36b7880ec26
  36. # docker 保存镜像
  37. docker save registry.cn-hangzhou.aliyuncs.com/chenby/cni:master -o cni.tar
  38. docker save registry.cn-hangzhou.aliyuncs.com/chenby/node:master -o node.tar
  39. docker save registry.cn-hangzhou.aliyuncs.com/chenby/typha:master -o typha.tar
  40. docker save registry.cn-hangzhou.aliyuncs.com/chenby/kube-controllers:master -o kube-controllers.tar
  41. docker save registry.cn-hangzhou.aliyuncs.com/chenby/coredns:v1.10.0 -o coredns.tar
  42. docker save registry.cn-hangzhou.aliyuncs.com/chenby/pause:3.6 -o pause.tar
  43. docker save registry.cn-hangzhou.aliyuncs.com/chenby/metrics-server:v0.5.2 -o metrics-server.tar
  44. docker save kubernetesui/dashboard:v2.7.0 -o dashboard.tar
  45. docker save kubernetesui/metrics-scraper:v1.0.8 -o metrics-scraper.tar
  46. docker save quay.io/cilium/cilium:v1.12.6 -o cilium.tar
  47. docker save quay.io/cilium/certgen:v0.1.8 -o certgen.tar
  48. docker save quay.io/cilium/hubble-relay:v1.12.6 -o hubble-relay.tar
  49. docker save quay.io/cilium/hubble-ui-backend:v0.9.2 -o hubble-ui-backend.tar
  50. docker save quay.io/cilium/hubble-ui:v0.9.2 -o hubble-ui.tar
  51. docker save quay.io/cilium/cilium-etcd-operator:v2.0.7 -o cilium-etcd-operator.tar
  52. docker save quay.io/cilium/operator:v1.12.6 -o operator.tar
  53. docker save quay.io/cilium/clustermesh-apiserver:v1.12.6 -o clustermesh-apiserver.tar
  54. docker save quay.io/coreos/etcd:v3.5.4 -o etcd.tar
  55. docker save quay.io/cilium/startup-script:d69851597ea019af980891a4628fb36b7880ec26 -o startup-script.tar
  56. # 传输到各个节点
  57. for NODE in k8s-master01 k8s-master02 k8s-master03 k8s-node01 k8s-node02; do scp -r images/ $NODE:/root/ ; done
  58. # 创建命名空间
  59. ctr ns create k8s.io
  60. # 导入镜像
  61. ctr --namespace k8s.io image import images/cni.tar
  62. ctr --namespace k8s.io image import images/node.tar
  63. ctr --namespace k8s.io image import images/typha.tar
  64. ctr --namespace k8s.io image import images/kube-controllers.tar
  65. ctr --namespace k8s.io image import images/coredns.tar
  66. ctr --namespace k8s.io image import images/pause.tar
  67. ctr --namespace k8s.io image import images/metrics-server.tar
  68. ctr --namespace k8s.io image import images/dashboard.tar
  69. ctr --namespace k8s.io image import images/metrics-scraper.tar
  70. ctr --namespace k8s.io image import images/dashboard.tar
  71. ctr --namespace k8s.io image import images/metrics-scraper.tar
  72. ctr --namespace k8s.io image import images/cilium.tar
  73. ctr --namespace k8s.io image import images/certgen.tar
  74. ctr --namespace k8s.io image import images/hubble-relay.tar
  75. ctr --namespace k8s.io image import images/hubble-ui-backend.tar
  76. ctr --namespace k8s.io image import images/hubble-ui.tar
  77. ctr --namespace k8s.io image import images/cilium-etcd-operator.tar
  78. ctr --namespace k8s.io image import images/operator.tar
  79. ctr --namespace k8s.io image import images/clustermesh-apiserver.tar
  80. ctr --namespace k8s.io image import images/etcd.tar
  81. ctr --namespace k8s.io image import images/startup-script.tar
  82. # pull tar包 解压后
  83. helm pull cilium/cilium
  84. # 查看镜像版本
  85. root@hello:~/cilium# cat values.yaml| grep tag: -C1
  86. repository: "quay.io/cilium/cilium"
  87. tag: "v1.12.6"
  88. pullPolicy: "IfNotPresent"
  89. --
  90. repository: "quay.io/cilium/certgen"
  91. tag: "v0.1.8@sha256:4a456552a5f192992a6edcec2febb1c54870d665173a33dc7d876129b199ddbd"
  92. pullPolicy: "IfNotPresent"
  93. --
  94. repository: "quay.io/cilium/hubble-relay"
  95. tag: "v1.12.6"
  96. # hubble-relay-digest
  97. --
  98. repository: "quay.io/cilium/hubble-ui-backend"
  99. tag: "v0.9.2@sha256:a3ac4d5b87889c9f7cc6323e86d3126b0d382933bd64f44382a92778b0cde5d7"
  100. pullPolicy: "IfNotPresent"
  101. --
  102. repository: "quay.io/cilium/hubble-ui"
  103. tag: "v0.9.2@sha256:d3596efc94a41c6b772b9afe6fe47c17417658956e04c3e2a28d293f2670663e"
  104. pullPolicy: "IfNotPresent"
  105. --
  106. repository: "quay.io/cilium/cilium-etcd-operator"
  107. tag: "v2.0.7@sha256:04b8327f7f992693c2cb483b999041ed8f92efc8e14f2a5f3ab95574a65ea2dc"
  108. pullPolicy: "IfNotPresent"
  109. --
  110. repository: "quay.io/cilium/operator"
  111. tag: "v1.12.6"
  112. # operator-generic-digest
  113. --
  114. repository: "quay.io/cilium/startup-script"
  115. tag: "d69851597ea019af980891a4628fb36b7880ec26"
  116. pullPolicy: "IfNotPresent"
  117. --
  118. repository: "quay.io/cilium/cilium"
  119. tag: "v1.12.6"
  120. # cilium-digest
  121. --
  122. repository: "quay.io/cilium/clustermesh-apiserver"
  123. tag: "v1.12.6"
  124. # clustermesh-apiserver-digest
  125. --
  126. repository: "quay.io/coreos/etcd"
  127. tag: "v3.5.4@sha256:795d8660c48c439a7c3764c2330ed9222ab5db5bb524d8d0607cac76f7ba82a3"
  128. pullPolicy: "IfNotPresent"

关于

https://www.oiox.cn/

https://www.oiox.cn/index.php/start-page.html

CSDN、GitHub、知乎、开源中国、思否、掘金、简书、华为云、阿里云、腾讯云、哔哩哔哩、今日头条、新浪微博、个人博客

全网可搜《小陈运维》

文章主要发布于微信公众号:《Linux运维交流社区》

原文链接:https://www.cnblogs.com/chenby/p/18019665

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号