当前位置:   article > 正文

二进制部署

二进制部署

准备

需要三台设备:一台master,两台node,etcd安装在node里

master/node:192.168.116.21

node01:192.168.116.22

node02:192.168.116.23

1、操作系统初始化配置

关闭防火墙

  1. systemctl stop firewalld
  2. systemctl disable firewalld
  3. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

关闭selinux

  1. setenforce 0
  2. sed -i 's/enforcing/disabled/' /etc/selinux/config

关闭swap

  1. swapoff -a
  2. sed -ri 's/.*swap.*/#&/' /etc/fstab

根据规划设置主机名

  1. hostnamectl set-hostname master01
  2. hostnamectl set-hostname node01
  3. hostnamectl set-hostname node02

在master添加hosts

  1. cat >> /etc/hosts << EOF
  2. 192.168.116.21 master01
  3. 192.168.116.22 node01
  4. 192.168.116.23 node02
  5. EOF

调整内核参数

  1. cat > /etc/sysctl.d/k8s.conf << EOF
  2. #开启网桥模式,可将网桥的流量传递给iptables链
  3. net.bridge.bridge-nf-call-ip6tables = 1
  4. net.bridge.bridge-nf-call-iptables = 1
  5. #关闭ipv6协议
  6. net.ipv6.conf.all.disable_ipv6=1
  7. net.ipv4.ip_forward=1
  8. EOF
  9. sysctl --system

时间同步

  1. yum install ntpdate -y
  2. ntpdate time.windows.com

2、所有 node 节点部署docker引擎

  1. yum install -y yum-utils device-mapper-persistent-data lvm2
  2. yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  3. yum install -y docker-ce docker-ce-cli containerd.io
  4. systemctl start docker.service
  5. systemctl enable docker.service

2.1、修改docker配置文件

  1. docker info
  2. 查看默认存储引擎是cgroupfs引擎

添加一个.json结尾的配置文件

  1. cd /etc/docker
  2. vim daemon.json
  1. {
  2.  "registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"],
  3.  "exec-opts":["native.cgroupdriver=systemd"],
  4.  "log-dirver": "json-file",
  5.  "log-opts": {
  6.     "max-size":"500m","max-file": "3"
  7. }
  8. }
  9. ---------------------------------------------------------------------------
  10. 仓库镜像地址
  11. "registry-mirrors":["https://6ijb8ubo.mirror.aliyuncs.com"]
  12. 设置cgroup引擎为systemd
  13. "exec-opts":["native.cgroupdriver=systemd"],
  14. 日志的配置
  15. "log-dirver": "json-file",
  16.  "log-opts": {
  17.     "max-size":"500m","max-file": "3"
  1. cat > /etc/docker/daemon.json <<EOF
  2. {
  3.  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  4.  "exec-opts": ["native.cgroupdriver=systemd"],
  5.  "log-driver":"json-file",
  6.  "log-opts":{
  7.    "max-size":"500m","max-file":"3"
  8.   }
  9. }
  10. EOF
  1. systemctl restart docker.service
  2. #再查看引擎是否更改
  3. docker info | grep "Cgroup Driver"
  4. Cgroup Driver: systemd

 

 

3、搭建etcd集群

  • etcd 目前默认使用2379端口提供HTTP API服务, 2380端口和peer通信

  • etcd 在生产环境中一般推荐集群方式部署。由于etcd 的leader选举机制,要求至少为3台或以上的奇数台。

了解etcd特性

特性说明
分布式存储etcd的数据存储式分布式的,可以跨多个节点进行分布,确保高可用性和可扩展性
强制性etcd提供强一致性的保证,确保在集群中的所有节点都能看到相同的数据视图
轻量级etcd采用轻量级的raft算法,确保集群中的节点之间达成一致
API支持etcd提供简单而强大的HTTP+JSON API,使开发人员可以轻松的与其进行交互,并集成到各种应用和工具中。
监听机制(watch机制)etcd支持监听机制,允许客户监视特定键的变化,并在数据发生变更时得到通知。
安全性etcd支持SSL/TLS加密。以保障数据在传输过程中的安全性,并提供基于角色的访问控制。

3.1、使用cfssl工具签发证书和私钥文件

CFSSL 使用配置文件生成证书,因此自签之前,需要生成它识别的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。

CFSSL 用来为 etcd 提供 TLS 证书,它支持签三种类型的证书:

证书说明
客户端证书(client 证书)服务端连接客户端时携带的证书,用于客户端验证服务端身份,如 kube-apiserver 访问 etcd
服务端证书(server 证书)客户端连接服务端时携带的证书,用于服务端验证客户端身份,如 etcd 对外提供服务
peer 证书集群内相互之间连接时使用的证书,如 etcd 节点之间进行验证和通信。

以上是安全级别最高的情况下所使用的三套安全证书。

这里全部都使用同一套证书认证。

3.1.1在master节点上生成证书

  1. 准备cfssl证书生成工具
  2. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
  3. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
  4. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
  5. -----------------------------------------------------------------------------------------
  6. cfssl:证书签发的工具命令
  7. cfssljson:将 cfssl 生成的证书(默认为json格式)转化为文件承载式证书
  8. cfssl-certinfo:验证证书的信息
  9. #查看证书的信息
  10. cfssl-certinfo -cert <证书名称>
  1. #将文件传入到/usr/local/bin目录下
  2. cd /usr/local/bin
  3. #给他们可执行的权限
  4. chmod +x /usr/local/bin/cfssl*

 

cfssl version #检查版本

 

  1. 将master和node节点的/opt目录下所有的文件清空
  2. 在master节点上创建一个k8s的安装目录
  3. mkdir k8s
  4. 进入目录中上传两个etcd的脚本文件
  5. etcd-cert.sh生成证书和私钥的文件
  6. etcd.sh启动etcd服务的脚本文件
  1. vim etcd-cert.sh
  2. #!/bin/bash
  3. #配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
  4. cat > ca-config.json <<EOF
  5. {
  6. "signing": {
  7. "default": {
  8. "expiry": "87600h"
  9. },
  10. "profiles": {
  11. "www": {
  12. "expiry": "87600h",
  13. "usages": [
  14. "signing",
  15. "key encipherment",
  16. "server auth",
  17. "client auth"
  18. ]
  19. }
  20. }
  21. }
  22. }
  23. EOF
  24. #ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
  25. #后续在签名证书时会使用某个 profile;此实例只有一个 www 模板。
  26. #expiry:指定了证书的有效期,87600h 为10年,如果用默认值一年的话,证书到期后集群会立即宕掉
  27. #signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
  28. #key encipherment:表示使用非对称密钥加密,如 RSA 加密;
  29. #server auth:表示client可以用该 CA 对 server 提供的证书进行验证;
  30. #client auth:表示server可以用该 CA 对 client 提供的证书进行验证;
  31. #注意标点符号,最后一个字段一般是没有逗号的。
  32. #-----------------------
  33. #生成CA证书和私钥(根证书和私钥)
  34. #特别说明: cfssl和openssl有一些区别,openssl需要先生成私钥,然后用私钥生成请求文件,最后生成签名的证书和私钥等,但是cfssl可以直接得到请求文件。
  35. cat > ca-csr.json <<EOF
  36. {
  37. "CN": "etcd",
  38. "key": {
  39. "algo": "rsa",
  40. "size": 2048
  41. },
  42. "names": [
  43. {
  44. "C": "CN",
  45. "L": "Beijing",
  46. "ST": "Beijing"
  47. }
  48. ]
  49. }
  50. EOF
  51. #CN:Common Name,浏览器使用该字段验证网站或机构是否合法,一般写的是域名
  52. #key:指定了加密算法,一般使用rsa(size:2048)
  53. #C:Country,国家
  54. #ST:State,州,省
  55. #L:Locality,地区,城市
  56. #O: Organization Name,组织名称,公司名称
  57. #OU: Organization Unit Name,组织单位名称,公司部门
  58. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  59. #生成的文件:
  60. #ca-key.pem:根证书私钥
  61. #ca.pem:根证书
  62. #ca.csr:根证书签发请求文件
  63. #cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成新的证书和私钥。如果不添加管道符号,会直接把所有证书内容输出到屏幕。
  64. #注意:CSRJSON 文件用的是相对路径,所以 cfssl 的时候需要 csr 文件的路径下执行,也可以指定为绝对路径。
  65. #cfssljson 将 cfssl 生成的证书(json格式)变为文件承载式证书,-bare 用于命名生成的证书文件。
  66. #-----------------------
  67. #生成 etcd 服务器证书和私钥
  68. cat > server-csr.json <<EOF
  69. {
  70. "CN": "etcd",
  71. "hosts": [
  72. "192.168.116.21",
  73. "192.168.116.22",
  74. "192.168.116.23"
  75. ],
  76. "key": {
  77. "algo": "rsa",
  78. "size": 2048
  79. },
  80. "names": [
  81. {
  82. "C": "CN",
  83. "L": "BeiJing",
  84. "ST": "BeiJing"
  85. }
  86. ]
  87. }
  88. EOF
  89. #hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。
  90. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
  91. #生成的文件:
  92. #server.csr:服务器的证书请求文件
  93. #server-key.pem:服务器的私钥
  94. #server.pem:服务器的数字签名证书
  95. #-config:引用证书生成策略文件 ca-config.json
  96. #-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www
  1. vim etcd.sh
  2. #!/bin/bash
  3. #example: ./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380
  4. #创建etcd配置文件/opt/etcd/cfg/etcd
  5. ETCD_NAME=$1
  6. ETCD_IP=$2
  7. ETCD_CLUSTER=$3
  8. WORK_DIR=/opt/etcd
  9. cat > $WORK_DIR/cfg/etcd <<EOF
  10. #[Member]
  11. ETCD_NAME="${ETCD_NAME}"
  12. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  13. ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
  14. ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
  15. #[Clustering]
  16. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
  17. ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
  18. ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
  19. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  20. ETCD_INITIAL_CLUSTER_STATE="new"
  21. EOF
  22. #Member:成员配置
  23. #ETCD_NAME:节点名称,集群中唯一。成员名字,集群中必须具备唯一性,如etcd01
  24. #ETCD_DATA_DIR:数据目录。指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,还会存储WAL文件;如果不指定会用缺省目录
  25. #ETCD_LISTEN_PEER_URLS:集群通信监听地址。用于监听其他member发送信息的地址。ip为全0代表监听本机所有接口
  26. #ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址。用于监听etcd客户发送信息的地址。ip为全0代表监听本机所有接口
  27. #Clustering:集群配置
  28. #ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在
  29. #ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址。etcd客户端使用,客户端通过该地址与本member交互信息。一定要保证从客户侧能可访问该地址
  30. #ETCD_INITIAL_CLUSTER:集群节点地址。本member使用。描述集群中所有节点的信息,本member根据此信息去联系其他member
  31. #ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于区分不同集群。本地如有多个集群要设为不同
  32. #ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群。
  33. #创建etcd.service服务管理文件
  34. cat > /usr/lib/systemd/system/etcd.service <<EOF
  35. [Unit]
  36. Description=Etcd Server
  37. After=network.target
  38. After=network-online.target
  39. Wants=network-online.target
  40. [Service]
  41. Type=notify
  42. EnvironmentFile=${WORK_DIR}/cfg/etcd
  43. ExecStart=${WORK_DIR}/bin/etcd \
  44. --cert-file=${WORK_DIR}/ssl/server.pem \
  45. --key-file=${WORK_DIR}/ssl/server-key.pem \
  46. --trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
  47. --peer-cert-file=${WORK_DIR}/ssl/server.pem \
  48. --peer-key-file=${WORK_DIR}/ssl/server-key.pem \
  49. --peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
  50. --logger=zap \
  51. --enable-v2
  52. Restart=on-failure
  53. LimitNOFILE=65536
  54. [Install]
  55. WantedBy=multi-user.target
  56. EOF
  57. #--enable-v2:开启 etcd v2 API 接口。当前 flannel 版本不支持 etcd v3 通信
  58. #--logger=zap:使用 zap 日志框架。zap.Logger 是go语言中相对日志库中性能最高的
  59. #--peer开头的配置项用于指定集群内部TLS相关证书(peer 证书),这里全部都使用同一套证书认证
  60. #不带--peer开头的的参数是指定 etcd 服务器TLS相关证书(server 证书),这里全部都使用同一套证书认证
  61. systemctl daemon-reload
  62. systemctl enable etcd
  63. systemctl restart etcd

生成CA证书、etcd 服务器证书以及私钥

  1. ./etcd-cert.sh
  2. mkdir etcd-cert
  3. mv ca* server* etcd-cert

3.2解压etcd软件包,获取二进制文件 etcd etcdctl

 
  1. 解压
  2. tar xf etcd-v3.4.26-linux-amd64.tar.gz
  1. [root@master01 etcd-v3.4.26-linux-amd64]# ls
  2. Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
  3. etcd是启动etcd程序进程用的
  4. etcdctl是etcd命令行客户端的工具
 

3.3准备etcd集群配置文件

创建用于存放 etcd 配置文件,命令文件,证书的目录

  1. mkdir -p /opt/etcd/{cfg,bin,ssl}
  2. ----------------------------------
  3. cfg:存放配置文件的目录
  4. bin:存放命令文件的目录
  5. ssl:存放证书的目录

将etcd和etcdctl移动到bin目录

  1. mv /opt/k8s/etcd-v3.4.26-linux-amd64/etcd etcdctl /opt/etcd/bin
  2. 创建软连接,方便以后直接调用
  3. ln -s /opt/etcd/bin/* /usr/local/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/

3.4启动etcd进程服务,将所有节点加入到etcd集群中

  1. cd /opt/k8s/
  2. ./etcd.sh etcd01 192.168.116.21 etcd02=https://192.168.116.22:2380,etcd03=https://192.168.116.23:2380
  3. 进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动

 

3.4.1可另外打开一个窗口查看etcd进程是否正常
  1. netstat -lntp | grep 2379
  2. ps -aux | grep etcd
  3. ps -ef | grep etcd
3.4.2把etcd相关证书文件、命令文件和服务管理文件全部拷贝到另外两个etcd集群节点
  1. scp -r /opt/etcd/ node01:/opt/
  2. scp -r /opt/etcd/ node02:/opt/
  3. scp /usr/lib/systemd/system/etcd.service node01:/usr/lib/systemd/system/
  4. scp /usr/lib/systemd/system/etcd.service node02:/usr/lib/systemd/system/
3.4.3进入node01和node02里更改配置文件
vim /opt/etcd/cfg/etcd

  1. 更改完之后开启etcd
  2. systemctl enable --now etcd
  3. netstat -lntp | grep 2379
  4. 成功后,这样所有的etcd服务全部起来了

3.4.4检查etcd群集状态
  1. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" endpoint health --write-out=table
  2. --cert-file:识别HTTPS端使用SSL证书文件
  3. --key-file:使用此SSL密钥文件标识HTTPS客户端
  4. --ca-file:使用此CA证书验证启用https的服务器的证书
  5. --endpoints:集群中以逗号分隔的机器地址列表
  6. cluster-health:检查etcd集群的运行状况
3.4.5查看etcd集群成员列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379" --write-out=table member list

4.部署master组件

4.1在 master01 节点上操作

上传 master.zip 和 k8s-cert.sh 到 /opt/k8s 目录中,解压 master.zip 压缩包

  1. cd /opt/k8s/
  2. unzip master.zip
  3. chmod +x *.sh

4.2准备证书

vim k8s-cert.sh

  1. 创建用于生成CA证书、相关组件的证书和私钥的目录
  2. mkdir k8s-cert
  3. mv k8s-cert.sh k8s-cert
  4. cd k8s-cert/
  5. chmod +x k8s-cert.sh
  6. 生成CA证书、相关组件的证书和私钥
  7. ./k8s-cert.sh

 

创建一个k8s的软件目录

  1. cd /opt
  2. mkdir kubernetes
  3. cd kubernetes/
  4. mkdir bin cfg ssl logs
  5. cp /opt/k8s/k8s-cert/*.pem /opt/kubernetes/ssl

4.3 准备二进制文件

上传二进制包

  1. cd /opt/k8s
  2. tar xf kubernetes-server-linux-amd64.tar.gz

复制master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中

  1. cd /opt/k8s/kubernetes/server/bin
  2. cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
  3. ln -s /opt/kubernetes/bin/* /usr/local/bin/

4.4准备认证文件

创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权

  1. cd /opt/k8s/
  2. vim token.sh
  3. #!/bin/bash
  4. #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
  5. BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
  6. #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
  7. cat > /opt/kubernetes/cfg/token.csv <<EOF
  8. ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
  9. EOF
  10. chmod +x token.sh
  11. ./token.sh

4.5开启 apiserver 服务

  1. cd /opt/k8s/
  2. vim apiserver.sh
  3. ./apiserver.sh 192.168.116.21 https://192.168.116.21:2379,https://192.168.116.22:2379,https://192.168.116.23:2379
  4. 检查进程是否启动成功
  5. ps aux | grep kube-apiserver

4.6启动 controller-manager 服务

  1. cd /opt/k8s/
  2. vim controller-manager.sh
  3. ./controller-manager.sh
  4. ps aux | grep kube-controller-manager

4.7启动 scheduler 服务

  1. cd /opt/k8s/
  2. vim scheduler.sh
  3. ./scheduler.sh
  4. ps aux | grep kube-scheduler

4.8生成kubectl连接集群的kubeconfig文件

  1. vim admin.sh
  2. ./admin.sh
  3. 绑定默认cluster-admin管理员集群角色,授权kubectl访问集群
  4. kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
  1. 判断master是否正常,就用
  2. kubectl get cs

4.9查看客户端和服务端的版本号

kubectl version

5.部署 Worker Node 组件

5.1在所有 node 节点上操作

#创建kubernetes工作目录

mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh

  1. cd /opt/
  2. mkdir k8s
  3. cd k8s
  4. 上传node.zip
  5. unzip node.zip
  6. chmod +x kubelet.sh proxy.sh

5.2在 master01 节点上操作

把 kubelet、kube-proxy 拷贝到 node 节点

  1. cd /opt/k8s/kubernetes/server/bin
  2. scp kubelet kube-proxy node01:/opt/kubernetes/bin/
  3. scp kubelet kube-proxy node02:/opt/kubernetes/bin/

上传kubeconfig.sh文件到/opt/k8s/kubeconfig目录中,生成kubelet初次加入集群引导kubeconfig文件和kube-proxy.kubeconfig文件

  1. mkdir /opt/k8s/kubeconfig
  2. cd /opt/k8s/kubeconfig
  3. 修改里面的配置
  4. vim kubeconfig.sh
  5. chmod +x kubeconfig.sh
  6. ./kubeconfig.sh 192.168.116.21 /opt/k8s/k8s-cert/

把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点

  1. scp bootstrap.kubeconfig kube-proxy.kubeconfig node01:/opt/kubernetes/cfg/
  2. scp bootstrap.kubeconfig kube-proxy.kubeconfig node02:/opt/kubernetes/cfg/

RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书

kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

5.3在 node01 节点上操作

启动 kubelet 服务

  1. cd /opt/k8s/
  2. chmod +x kubelet.sh
  3. ./kubelet.sh 192.168.116.22
  4. 查看是否启动成功
  5. ps aux | grep kubelet

 

5.4在 master01 节点上操作,通过 CSR 请求

检查到 node01 节点的 kubelet 发起的 CSR 请求,Pending 表示等待集群给该节点签发证书

kubectl get csr

通过 CSR 请求

kubectl certificate approve node-csr-te9jUMtI8OmMwIojbc3YMMqwp8O20w1q5znPVg7kZvQ

Approved,Issued 表示已授权 CSR 请求并签发证书

查看节点,由于网络插件还没有部署,节点会没有准备就绪 NotReady

  1. kubectl get node
  2. 进入node节点
  3. 查看证书
  4. ls /opt/kubernetes/ssl

5.5在 node01 节点上操作

加载 ip_vs 模块

  1. cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
  2. for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
  3. 查看模块是否加载完成
  4. cat /proc/net/ip_vs

启动proxy服务

  1. cd /opt/
  2. vim ./proxy.sh
  3. ./proxy.sh 192.168.80.11
  4. ps aux | grep kube-proxy

5.6进入node02节点

  1. cd /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/netfilter/ipvs
  2. for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
  3. 查看模块是否加载完成
  4. cat /proc/net/ip_vs

启动kubelet

  1. cd /opt/k8s
  2. vim kubelet.sh
  3. ./kubelet.sh 192.168.116.23
  4. 进入master节点
  5. kubectl get csr
  6. kubectl certificate approve node-csr-P7dmlFvwrB_FN7_769rPTIXpt8f-LsyTmS7UMYMBKkU
  7. kubectl get csr
  8. 进入node节点
  9. 查看证书
  10. ls /opt/kubernetes/ssl

启动proxy

  1. cd /opt/k8s
  2. vim proxy.sh
  3. ./proxy.sh 192.168.116.23
  4. ps aux | grep proxy
  5. 进入master节点
  6. kubectl get nodes

6.部署 CNI 网络组件

目前比较常用的时flannel和calico,flannel的功能比较简单,不具备复杂的网络策略配置能力,calico是比较出色的网络管理插件,但具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多网络策略,则使用calico更好。

6.1部署 flannel

node01 节点上操作

上传flannel软件包到/opt/k8s

  1. cd /opt/k8s
  2. unzip flannel-v0.21.5.zip
  3. docker load -i flannel-cni-plugin.tar
  4. docker load -i flannel.tar
 
  1. mkdir /opt/k8s/cni/bin
  2. tar zxvf cni-plugins-linux-amd64-v1.3.0.tgz -C /opt/cni/bin

将node01的k8s目录中的所有.tar文件包复制给node02节点里

  1. cd /opt/k8s
  2. scp *.tar 192.168.116.23:/opt/k8s

进入node02节点

  1. docker load -i flannel-cni-plugin.tar
  2. docker load -i flannel.tar
  3. docker images

再将node01的插件目录复制到node02节点中

  1. 进入node01
  2. cd /opt
  3. scp -r cni/ 192.168.116.23:/opt

将node01的yml文件复制到master节点中

scp kube-flannel.yml 192.168.116.21:/opt/k8s

在master执行yml文件

  1. kubectl apply -f kube-flannel.yml
  2. 会自动创建flannel所需要的资源
  1. 检查部署是否成功
  2. kubectl get pods -n kube-flannel -owide
  3. 当显示node01和node02节点都为running时,即为部署成功
 
  1. 此时使用kubectl get nodes查看
  2. 两个节点都为reday
  3. 此时k8s集群都为正常了

也会在每个安装了flannel插件的节点上自动生成一个flannel.1的一个接口

ifconfig

7.部署 CoreDNS

CoreDNS 是 K8S 默认的集群内部 DNS 功能实现,为 K8S 集群内的 Pod 提供 DNS 解析服务

在所有node节点上上传coredns的镜像

  1. cd /opt/k8s
  2. docker load -i coredns.tar

到master节点上上传配置文件

  1. cd /opt/k8s
  2. kubectl apply -f coredns.yaml
  3. 创建文件

 

检查coredns是否运行

kubectl get pods -n kube-system

8.多Master部署

到master节点里的配置文件中新增一台master节点地址

  1. cd /opt/k8s/k8s-cert
  2. vim k8s-cert.sh

 

8.1进入新的master节点做初始化操作

  1. 关闭防火墙
  2. ```
  3. systemctl stop firewalld
  4. systemctl disable firewalld
  5. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
  6. ```
  7. 关闭selinux
  8. ```
  9. setenforce 0
  10. sed -i 's/enforcing/disabled/' /etc/selinux/config
  11. ```
  12. 关闭swap
  13. ```
  14. swapoff -a
  15. sed -ri 's/.*swap.*/#&/' /etc/fstab
  16. ```
  17. 根据规划设置主机名
  18. ```
  19. hostnamectl set-hostname master02
  20. su
  21. ```
  22. 在master添加hosts
  23. ```
  24. cat >> /etc/hosts << EOF
  25. 192.168.116.21 master01
  26. 192.168.116.24 master02
  27. 192.168.116.22 node01
  28. 192.168.116.23 node02
  29. EOF
  30. 修改完之后要在所有节点里设置
  31. vim /etc/hosts
  32. 添加192.168.116.24 master02
  33. 调整内核参数
  34. ```
  35. cat > /etc/sysctl.d/k8s.conf << EOF
  36. #开启网桥模式,可将网桥的流量传递给iptables链
  37. net.bridge.bridge-nf-call-ip6tables = 1
  38. net.bridge.bridge-nf-call-iptables = 1
  39. #关闭ipv6协议
  40. net.ipv6.conf.all.disable_ipv6=1
  41. net.ipv4.ip_forward=1
  42. EOF
  43. sysctl --system
  44. ```
  45. 时间同步
  46. ```
  47. yum install ntpdate -y
  48. ntpdate time.windows.com
  49. ```

在master01的节点里把master02所需的配置文件发送过去

  1. cd /opt
  2. scp -r kubernetes/ /etcd/ master02:/opt

在master02节点里将传过去的原先的日志文件清空

  1. cd /opt/kubernetes/logs
  2. rm -rf *
  3. cd /opt/etcd
  4. rm -rf bin cfg

进入master01节点里将kube工具传给master02的家目录下

  1. cd
  2. scp -r .kube/ master02:/root
  3. 进入master02节点
  4. ls -A
  5. cd .kube
  6. rm -rf cache/

进入master01节点

  1. cd /usr/lib/systemd/system
  2. scp kube-* master02:`pwd`
  3. 进入master02节点中去查看
  4. ls /usr/lib/systemd/system/kube-*

修改master02启动的参数配置

  1. cd /opt/kubernetes/cfg
  2. vim kube-apiserver
 
vim kube-controller-manager
 
vim kube-scheduler

将程序都启动

  1. systemctl enable kube-apiserver.service --now
  2. systemctl enable kube-controller-manager.service --now
  3. systemctl enable kube-scheduler.service --now
  4. systemctl status kube-*

把bin目录中的二进制文件做个软连接

  1. ln -s /opt/kubernetes/bin/* /usr/local/bin
  2. 检查各个node节点状态
  3. kubectl get nodes
  4. kubectl get cs

进入master查看证书

  1. vim /opt/k8s/k8s-cert/k8s-cert.sh
  2. vip地址为192.168.116.200
  3. 两个负载均衡器的地址为14和15

准备好两台负载均衡,用nginx做负载均衡

  1. 192.168.116.14
  2. 192.168.116.15
  3. systemctl stop firewalld
  4. setenforce 0
  5. cd /etc/yum.repos.d
  6. 上传nginx.repo包
  7. yum install -y nginx
  8. systemctl enable --now nginx
 

8.2使用四层代理做转发

  1. 先确认stream模块是否打开
  2. nginx -V
 
  1. cd /etc/nginx/
  2. vim nginx.conf
  3. 在http上添加四层代理转发
  4. stream {
  5.   upstream k8s-apiservers {
  6.       server 192.168.116.21:6443;
  7.       server 192.168.116.24:6443;
  8. }
  9.   server {
  10.           listen 6443;
  11.           proxy_pass k8s-apiservers;
  12.   }
  13. }
  14. 检查语法结构
  15. nginx -t
  16. systemctl restart nginx
  17. 至此nginx负载均衡已经准备好了

两台负载均衡 准备keepalived

yum install -y keepalived.x86_64

在192.168.116.14节点准备一个脚本文件

  1. cd /etc/keepalived/
  2. vim check_nginx.sh
  3. #!/bin/bash
  4. if ! killall -0 nginx
  5. then
  6. systemctl stop keepalived
  7. fi

修改keepalived配置文件

  1. vim keepalived.conf
  2. ! Configuration File for keepalived
  3. global_defs {
  4.   notification_email {
  5.     acassen@firewall.loc
  6.     failover@firewall.loc
  7.     sysadmin@firewall.loc
  8.   }
  9.   notification_email_from Alexandre.Cassen@firewall.loc
  10.   smtp_server 127.0.0.1
  11.   smtp_connect_timeout 30
  12.   router_id NGINX_01
  13. }
  14. vrrp_scipt check_nginx {
  15.   interval 2
  16.   script "/etc/keeplived/check_nginx.sh"
  17. }
  18. vrrp_instance VI_1 {
  19.   state MASTER
  20.   interface ens33
  21.   virtual_router_id 51
  22.   priority 100
  23.   advert_int 1
  24.   authentication {
  25.       auth_type PASS
  26.       auth_pass 1111
  27.   }
  28.   virtual_ipaddress {
  29.       192.168.116.200
  30.   }
  31.   track_script {
  32.     check_nginx
  33.   }
  34. }
  35. systemctl enable --now keepalived.service
  36. --------------------------------------------------------------------
  37. 检查是否有VIP地址
  38. ip addr
scp * 192.168.116.15:`pwd`

然后将修改好的配置文件复制给192.168.116.15

scp * 192.168.116.15:`pwd`

进入192.168.116.15,修改keepalived.conf文件

  1. cd /etc/keepalived/
  2. vim keepalived.conf
  3. ! Configuration File for keepalived
  4. global_defs {
  5.   notification_email {
  6.     acassen@firewall.loc
  7.     failover@firewall.loc
  8.     sysadmin@firewall.loc
  9.   }
  10.   notification_email_from Alexandre.Cassen@firewall.loc
  11.   smtp_server 127.0.0.1
  12.   smtp_connect_timeout 30
  13.   router_id NGINX_02
  14. }  
  15. vrrp_scipt check_nginx {
  16.   interval 2
  17.   script "/etc/keeplived/check_nginx.sh"
  18. }  
  19. vrrp_instance VI_1 {
  20.   state BACKUP
  21.   interface ens33
  22.   virtual_router_id 51
  23.   priority 90
  24.   advert_int 1
  25.   authentication {
  26.       auth_type PASS
  27.       auth_pass 1111
  28.   }  
  29.   virtual_ipaddress {
  30.       192.168.116.200
  31.   }  
  32.   track_script {
  33.     check_nginx
  34.   }
  35. }  
  36. systemctl enable --now keepalived.service

8.3修改node节点上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件为VIP

  1. cd /opt/kubernetes/cfg
  2. -------------------------------------------
  3. vim bootstrap.kubeconfig
  4. server: https://192.168.116.200:6443
  5. -------------------------------------------
  6. vim kube-proxy.kubeconfig
  7. server: https://192.168.116.200:6443
  8. -------------------------------------------
  9. vim kubelet.kubeconfig
  10. server: https://192.168.116.200:6443

8.4两台node节点重启kubelet和kube-proxy服务

systemctl restart kubelet.service kube-proxy.service

在负载均衡服务器上查看 nginx 和 node 、 master 节点的连接状态

netstat -natp | grep nginx

在master02上进行操作

  1. cd /opt/kubernetes/cfg
  2. --------------------------------------------------------------
  3. vim kube-scheduler.kubeconfig
  4. server: https://192.168.116.24:6443
  5. -------------------------------------------------------------
  6. vim kube-controller-manager.kubeconfig
  7. server: https://192.168.116.24:6443
  8. 重启服务
  9. systemctl restart kube-controller-manager.service kube-scheduler.service

到此k8s多Master集群已完成搭建

总结

1.部署etcd

使用cfssl工具签发证书和私钥文件 解压etcd软件包,获取二进制文件 etcd etcdctl 准备etcd集群配置文件 启动etcd进程服务,将所有节点加入到etcd集群中

  1. etcd的操作:
  2. #查看etcd集群健康状态
  3. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint health
  4. #查看etcd集群状态信息
  5. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable endpoint status
  6. #查看etcd集群成员列表
  7. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379,https://IP2:2379,https://IP3:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 -wtable member list
  8. #向etcd插入键值
  9. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 put <KEY> '<VALUE>'
  10. #查看键的值
  11. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 get <KEY>
  12. #删除键
  13. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 del <KEY>
  14. #备份etcd数据库
  15. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot save 备份文件路径
  16. #恢复etcd数据库
  17. ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://IP1:2379" --cacert=CA证书 --cert=客户端证书 --key=客户端私钥 snapshot restore 备份文件路径

2.部署master组件

  1. 使用cfssl工具签发证书和私钥文件

  2. 下载K8S软件包,获取二进制文件 kube-apiserver kube-controller-manager kube-scheduler

  3. 准备 kube-apiserver 启动时要调用的 bootstrap-token 认证文件(token.csv)

  4. 准备 kube-apiserver kube-controller-manager kube-scheduler 的进程服务启动参数配置文件

  5. 准备 kube-controller-manager kube-scheduler kubectl 的 kubeconfig 集群引导配置文件(用于连接和验证 kube-apiserver)

  6. 依次启动 kube-apiserver kube-controller-manager kube-scheduler 进程服务

  7. 执行 kubectl get cs 命令查看master组件的健康状态

3.部署node组件

  1. 获取二进制文件 kubelet kube-proxy

  2. 准备 kubelet kube-proxy 使用的 kubeconfig集群引导配置文件 bootstrap.kubeconfig(kubelet首次访问apiserver使用认证的文件) kube-proxy.kubeconfig

  3. 准备 kubelet kube-proxy 的进程服务启动参数配置文件

  4. 启动 kubelet 进程服务,向 apiserver 发起 CSR 请求自动签发证书,master 通过 CSR 请求后 kubelet 即可获取到证书

  5. 加载 ipvs 模块,启动 kube-proxy 进程服务

  6. 安装 cni 网络插件(flannel或calico)和 CoreDNS

  7. 执行 kubectl get nodes 命令查看node节点状态

4.部署多master高可用

  1. 负责master组件相关的二进制文件、证书、私钥、启动参数配置文件、kubeconfig集群引导配置文件和etcd的证书、私钥文件

  2. 修改 kube-apiserver kube-controller-manager kube-scheduler 启动参数配置文件里的监听地址和通告地址,再依次重启服务进程

  3. 部署 nginx/haproxy 负载均衡器和 keepalived 高可用

  4. 修改 kubelet kube-proxy kubectl 的kubeconfig集群引导配置文件里的server参数都指向keepalived的VIP地址,再重启 kubelet kube-proxy 服务进程

  5. 修改其它master节点上的 kube-controller-manager kube-scheduler 的kubeconfig集群引导配置文件里的server参数都指向各自本机的apiserver地址,再重启服务进程

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/825567
推荐阅读
相关标签
  

闽ICP备14008679号