• Kubernetes单主集群的部署(一)


    目录

     

    一、k8s单主架构集群的部署 

    1.操作系统初始化配置

    2.部署 etcd 集群 

    3.部署docker引擎

    4.部署 Master 组件

    5.部署 Worker Node 组件

    6.部署 CNI 网络组件(使用 flannel)


     

    一、k8s单主架构集群的部署 

    k8s集群master01:192.168.116.10
    k8s集群master02:192.168.116.20(第二部分高可用架构会加入)

    k8s集群node01:192.168.116.30
    k8s集群node02:192.168.116.40

    etcd集群节点1:192.168.116.10(etcd集群原则上单独部署,此实验为方便部署在节点上)
    etcd集群节点2:192.168.116.30
    etcd集群节点3:192.168.116.40

    负载均衡nginx+keepalive01(master):192.168.116.50
    负载均衡nginx+keepalive02(backup):192.168.116.60

    1.操作系统初始化配置

    1. #关闭防火墙
    2. systemctl disable --now firewalld
    3. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
    4. #关闭selinux
    5. setenforce 0
    6. sed -i 's/enforcing/disabled/' /etc/selinux/config
    7. #关闭swap
    8. swapoff -a
    9. sed -ri 's/.*swap.*/#&/' /etc/fstab
    10. #根据规划设置主机名
    11. hostnamectl set-hostname master01
    12. hostnamectl set-hostname node01
    13. hostnamectl set-hostname node02
    14. su
    15. #添加主机名映射
    16. vim /etc/hosts
    17. #添加
    18. 192.168.116.10 master01
    19. 192.168.116.30 node01
    20. 192.168.116.40 node02
    21. vim /etc/sysctl.d/k8s.conf
    22. #开启网桥模式,可将网桥的流量传递给iptables链
    23. net.bridge.bridge-nf-call-iptables=1
    24. net.bridge.bridge-nf-call-ip6tables=1
    25. #开启路由转发
    26. net.ipv4.ip_forward=1
    27. #关闭ipv6(可选)
    28. #net.ipv6.conf.all.disable_ipv6=1
    29. #加载系统配置
    30. sysctl --system
    31. #时间同步(可以做计划任务)
    32. yum install ntpdate -y
    33. ntpdate ntp.aliyun.com
    34. crontab -e
    35. */10 * * * * /usr/sbin/ntpdate ntp.aliyun.com &> /dev/null

    2.部署 etcd 集群 

    在 master01 节点上操作 

    先准备签发证书的环境

    CFSSL是CloudFlare公司开源的一款PKI/TLS工具。CFSSL包含一个命令行工具和一个用于签名、验证和捆绑TLS证书的HTTPAPI服务。使用Go语言编写。

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

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

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

    这里为了方便全部都使用同一套证书认证,生产环境中一般不这样使用。

    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. chmod +x /usr/local/bin/cfssl*

    cfssl:证书签发的工具命令
    cfssljson:将cfssl生成的证书(json格式)变为文件承载式证书

    cfssl-certinfo:验证证书的信息


    cfssl-certinfo -cert <证书名称>        #可以使用此命令查看证书的信息

    编写etcd-cert.sh用于生成CA证书、etcd 服务器证书以及私钥

    1. mkdir -p /opt/k8s/etcd-cert
    2. cd /opt/k8s/etcd-cert
    3. vim /opt/k8s/etcd-cert/etcd-cert.sh
    4. #!/bin/bash
    5. #配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
    6. cat > ca-config.json <<EOF
    7. {
    8. "signing": {
    9. "default": {
    10. "expiry": "87600h"
    11. },
    12. "profiles": {
    13. "www": {
    14. "expiry": "87600h",
    15. "usages": [
    16. "signing",
    17. "key encipherment",
    18. "server auth",
    19. "client auth"
    20. ]
    21. }
    22. }
    23. }
    24. }
    25. EOF
    26. #ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;
    27. #后续在签名证书时会使用某个 profile;此实例只有一个 www 模板。
    28. #expiry:指定了证书的有效期,87600h 为10年,如果用默认值一年的话,证书到期后集群会立即宕掉
    29. #signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    30. #key encipherment:表示使用非对称密钥加密,如 RSA 加密;
    31. #server auth:表示client可以用该 CA 对 server 提供的证书进行验证;
    32. #client auth:表示server可以用该 CA 对 client 提供的证书进行验证;
    33. #注意标点符号,最后一个字段一般是没有逗号的。
    34. #-----------------------
    35. #生成CA证书和私钥(根证书和私钥)
    36. #特别说明: cfssl和openssl有一些区别,openssl需要先生成私钥,然后用私钥生成请求文件,最后生成签名的证书和私钥等,但是cfssl可以直接得到请求文件。
    37. cat > ca-csr.json <<EOF
    38. {
    39. "CN": "etcd",
    40. "key": {
    41. "algo": "rsa",
    42. "size": 2048
    43. },
    44. "names": [
    45. {
    46. "C": "CN",
    47. "L": "Beijing",
    48. "ST": "Beijing"
    49. }
    50. ]
    51. }
    52. EOF
    53. #CN:Common Name,浏览器使用该字段验证网站或机构是否合法,一般写的是域名
    54. #key:指定了加密算法,一般使用rsa(size:2048)
    55. #C:Country,国家
    56. #ST:State,州,省
    57. #L:Locality,地区,城市
    58. #O: Organization Name,组织名称,公司名称
    59. #OU: Organization Unit Name,组织单位名称,公司部门
    60. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    61. #生成的文件:
    62. #ca-key.pem:根证书私钥
    63. #ca.pem:根证书
    64. #ca.csr:根证书签发请求文件
    65. #cfssl gencert -initca :使用 CSRJSON 文件生成生成新的证书和私钥。如果不添加管道符号,会直接把所有证书内容输出到屏幕。
    66. #注意:CSRJSON 文件用的是相对路径,所以 cfssl 的时候需要 csr 文件的路径下执行,也可以指定为绝对路径。
    67. #cfssljson 将 cfssl 生成的证书(json格式)变为文件承载式证书,-bare 用于命名生成的证书文件。
    68. #-----------------------
    69. #生成 etcd 服务器证书和私钥
    70. cat > server-csr.json <<EOF
    71. {
    72. "CN": "etcd",
    73. "hosts": [
    74. "192.168.116.10",
    75. "192.168.116.30",
    76. "192.168.116.40"
    77. ],
    78. "key": {
    79. "algo": "rsa",
    80. "size": 2048
    81. },
    82. "names": [
    83. {
    84. "C": "CN",
    85. "L": "BeiJing",
    86. "ST": "BeiJing"
    87. }
    88. ]
    89. }
    90. EOF
    91. #hosts:将所有 etcd 集群节点添加到 host 列表,需要指定所有 etcd 集群的节点 ip 或主机名不能使用网段,新增 etcd 服务器需要重新签发证书。
    92. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
    93. #生成的文件:
    94. #server.csr:服务器的证书请求文件
    95. #server-key.pem:服务器的私钥
    96. #server.pem:服务器的数字签名证书
    97. #-config:引用证书生成策略文件 ca-config.json
    98. #-profile:指定证书生成策略文件中的的使用场景,比如 ca-config.json 中的 www
    99. #编写完后给上执行权限并执行
    100. chmod +x etcd-cert.sh
    101. ./etcd-cert.sh

    编写etcd服务脚本,添加集群配置

    1. vim /opt/k8s/etcd.sh
    2. #!/bin/bash
    3. #example: ./etcd.sh etcd01 192.168.80.10 etcd02=https://192.168.80.11:2380,etcd03=https://192.168.80.12: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
    64. #编写完后给上执行权限,在下一步需要执行
    65. chmod +x /opt/k8s/etcd.sh

    安装etcd服务,并启动集群

    1. #上传 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目录中,并尝试启动服务
    2. cd /opt/k8s/
    3. tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
    4. mkdir -p /opt/etcd/{cfg,bin,ssl}
    5. #etcdctl管理文件,etcd服务文件
    6. cd /opt/k8s/etcd-v3.4.9-linux-amd64/
    7. mv etcd etcdctl /opt/etcd/bin/
    8. cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
    9. #此脚本可以启动本地etcd服务,添加集群配置(第一次启动会卡住,是因为需要其他节点etcd服务加入)
    10. cd /opt/k8s/
    11. ./etcd.sh etcd01 192.168.116.10 etcd02=https://192.168.116.30:2380,etcd03=https://192.168.116.40:2380
    12. #复制服务脚本到其他etcd节点,并修改配置(见下图)
    13. scp -r /opt/etcd/ root@192.168.116.30:/opt/
    14. scp -r /opt/etcd/ root@192.168.116.40:/opt/
    15. scp /usr/lib/systemd/system/etcd.service root@192.168.116.30:/usr/lib/systemd/system/
    16. scp /usr/lib/systemd/system/etcd.service root@192.168.116.40:/usr/lib/systemd/system/
    17. #修改完后分别启动服务
    18. systemctl start etcd
    19. #然后在主etcd节点再次执行
    20. cd /opt/k8s/
    21. ./etcd.sh etcd01 192.168.116.10 etcd02=https://192.168.116.30:2380,etcd03=https://192.168.116.40:2380

    执行完后可以使用以下命令查看etcd集群状态(全为true则集群无误)

    #使用 health 是查看健康状态;使用 status 是查看所有状态信息

    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.10:2379,https://192.168.116.30:2379,https://192.168.116.40:2379" endpoint health --write-out=table 

    --cert:识别HTTPS端使用SSL证书文件

    --cacert:使用此CA证书验证启用https的服务器的证书

    --key:使用此SSL密钥文件标识HTTPS客户端

    --endpoints:集群中以逗号分隔的机器地址列表cluster-health: 检查etcd集群的运行状况

    --write-out=table 或 -wtable:以表格形式输出

    查看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.10:2379,https://192.168.116.30:2379,https://192.168.116.40:2379" member list --write-out=table

    补充 etcd 备份和还原方式

    注:备份时 endpoint 只需要指定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.10:2379" snapshot save 备份文件路径

    查看

    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.10:2379" snapshot status 备份文件路径 -wtable

    恢复

    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.10:2379" snapshot restore 备份文件路径

    3.部署docker引擎

    所有 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 

    4.部署 Master 组件

    编写master各组件认证的脚本

    1. mkdir /opt/k8s/k8s-cert
    2. vim k8s-cert.sh
    3. #!/bin/bash
    4. #配置证书生成策略,让 CA 软件知道颁发有什么功能的证书,生成用来签发其他组件证书的根证书
    5. cat > ca-config.json <<EOF
    6. {
    7. "signing": {
    8. "default": {
    9. "expiry": "87600h"
    10. },
    11. "profiles": {
    12. "kubernetes": {
    13. "expiry": "87600h",
    14. "usages": [
    15. "signing",
    16. "key encipherment",
    17. "server auth",
    18. "client auth"
    19. ]
    20. }
    21. }
    22. }
    23. }
    24. EOF
    25. #生成CA证书和私钥(根证书和私钥)
    26. cat > ca-csr.json <<EOF
    27. {
    28. "CN": "kubernetes",
    29. "key": {
    30. "algo": "rsa",
    31. "size": 2048
    32. },
    33. "names": [
    34. {
    35. "C": "CN",
    36. "L": "Beijing",
    37. "ST": "Beijing",
    38. "O": "k8s",
    39. "OU": "System"
    40. }
    41. ]
    42. }
    43. EOF
    44. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    45. #-----------------------
    46. #生成 apiserver 的证书和私钥(apiserver和其它k8s组件通信使用)
    47. #hosts中将所有可能作为 apiserver 的 ip 添加进去,后面 keepalived 使用的 VIP 也要加入
    48. cat > apiserver-csr.json <<EOF
    49. {
    50. "CN": "kubernetes",
    51. "hosts": [
    52. "10.0.0.1",
    53. "127.0.0.1",
    54. "192.168.116.10",
    55. "192.168.116.20",
    56. "192.168.116.100",
    57. "192.168.116.50",
    58. "192.168.116.60",
    59. "kubernetes",
    60. "kubernetes.default",
    61. "kubernetes.default.svc",
    62. "kubernetes.default.svc.cluster",
    63. "kubernetes.default.svc.cluster.local"
    64. ],
    65. "key": {
    66. "algo": "rsa",
    67. "size": 2048
    68. },
    69. "names": [
    70. {
    71. "C": "CN",
    72. "L": "BeiJing",
    73. "ST": "BeiJing",
    74. "O": "k8s",
    75. "OU": "System"
    76. }
    77. ]
    78. }
    79. EOF
    80. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
    81. #-----------------------
    82. #生成 kubectl 连接集群的证书和私钥,具有admin权限
    83. cat > admin-csr.json <<EOF
    84. {
    85. "CN": "admin",
    86. "hosts": [],
    87. "key": {
    88. "algo": "rsa",
    89. "size": 2048
    90. },
    91. "names": [
    92. {
    93. "C": "CN",
    94. "L": "BeiJing",
    95. "ST": "BeiJing",
    96. "O": "system:masters",
    97. "OU": "System"
    98. }
    99. ]
    100. }
    101. EOF
    102. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
    103. #-----------------------
    104. #生成 kube-proxy 的证书和私钥
    105. cat > kube-proxy-csr.json <<EOF
    106. {
    107. "CN": "system:kube-proxy",
    108. "hosts": [],
    109. "key": {
    110. "algo": "rsa",
    111. "size": 2048
    112. },
    113. "names": [
    114. {
    115. "C": "CN",
    116. "L": "BeiJing",
    117. "ST": "BeiJing",
    118. "O": "k8s",
    119. "OU": "System"
    120. }
    121. ]
    122. }
    123. EOF
    124. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    125. #给上执行权限并执行
    126. chmod +x k8s-cert.sh
    127. ./k8s-cert.sh
    128. #再将所需证书存放到/opt/kubernetes/ssl/
    129. cp ca*pem apiserver*pem /opt/kubernetes/ssl/

    安装k8s服务,准备master需要的工具

    1. #上传 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目录中,解压 kubernetes 压缩包
    2. cd /opt/k8s/
    3. tar zxvf kubernetes-server-linux-amd64.tar.gz
    4. #将master的组件和命令工具存放到/opt/kubernetes/bin/,做软连接能被系统识别
    5. cd /opt/k8s/kubernetes/server/bin
    6. cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
    7. ln -s /opt/kubernetes/bin/* /usr/local/bin/
    8. #上传master.zip到/opt/k8s目录并解压
    9. cd /opt/k8s/
    10. unzip master.zip -d master/
    11. cd master/
    12. chmod +x *.sh

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

    1. #创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权
    2. cd /opt/kubernetes
    3. vim token.sh
    4. #!/bin/bash
    5. #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格
    6. BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
    7. #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成
    8. cat > /opt/kubernetes/cfg/token.csv <<EOF
    9. ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
    10. EOF
    11. #执行
    12. chmod +x token.sh
    13. ./token.sh

    1. #执行apiserver脚本 后面跟master的ip 和 etcd集群的ip
    2. ./apiserver.sh 192.168.116.10 https://192.168.116.10:2379,https://192.168.116.30:2379,https://192.168.116.40:2379
    3. #再执行另外三个脚本
    4. ./controller-manager.sh
    5. ./scheduler.sh
    6. ./admin

    检查master组件和etcd集群状态

    5.部署 Worker Node 组件

    在所有 node 节点上操作

    1. #创建kubernetes工作目录
    2. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
    3. #上传 node.zip 到 /opt 目录中,解压 node.zip 压缩包,获得kubelet.sh、proxy.sh
    4. cd /opt/
    5. unzip node.zip
    6. chmod +x kubelet.sh proxy.sh

    在 master01 节点上操作

    1. #把 kubelet、kube-proxy 拷贝到 node 节点
    2. cd /opt/k8s/kubernetes/server/bin
    3. scp kubelet kube-proxy root@192.168.116.30:/opt/kubernetes/bin/
    4. scp kubelet kube-proxy root@192.168.116.40:/opt/kubernetes/bin/
    5. #上传 kubeconfig.sh 文件到 /opt/k8s/kubeconfig 目录中,生成 kubeconfig 的配置文件
    6. mkdir /opt/k8s/kubeconfig
    7. cd /opt/k8s/kubeconfig
    8. chmod +x kubeconfig.sh
    9. ./kubeconfig.sh 192.168.116.10 /opt/k8s/k8s-cert/
    10. scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.116.30:/opt/kubernetes/cfg/
    11. scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.116.40:/opt/kubernetes/cfg/
    12. #RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求
    13. kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap

    kubelet采用TLS Bootstrapping 机制,自动完成到kube-apiserver的注册,在node节点量较大或者后期自动扩容时非常有用。

    Master apiserver 启用TLS 认证后,node 节点kubelet 组件想要加入集群,必须使用CA签发的有效证书才能与apiserver 通信,当node节点很多时,签署证书是一件很繁琐的事情。因此Kubernetes引入了TLS bootstraping 机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向 apiserver申请证书,kubelet的证书由apiserver 动态签署。

    kubelet首次启动通过加载bootstrap.kubeconfig 中的用户Token和apiserver CA证书发起首次CSR请求,这个Token 被预先内置在apiserver节点的token.csv中,其身份为kubelet-bootstrap用户和system:kubelet-bootstrap 用户组;想要首次CSR请求能成功(即不会被 apiserver 401拒绝),则需要先创建一个ClusterRoleBinding,将kubelet-bootstrap 用户和system:node-bootstrapper 内置ClusterRole 绑定(通过 kubectl get clusterroles可查询),使其能够发起CSR认证请求。

    TLS bootstrapping 时的证书实际是由kube-controller-manager组件来签署的,也就是说证书有效期是kube-controller-manager组件控制的:kube-controller-manager组件提供了一个–experimental-cluster-signing-duration 参数来设置签署的证书有效时间:默认为8760h0m0s,将其改87600h0m0s,即10年后再进行TLS bootstrapping 签者证书即可。

    也就是说kubelet 首次访问API Server时,是使用token做认证,通过后,Controller Manager会为kubelet生成一个证书,以后的访问都是用证书做认证了。

    在两个 node 节点上操作

    1. #启动 kubelet 服务
    2. cd /opt/
    3. ./kubelet.sh 192.168.116.30

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

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

    kubectl certificate approve 请求名        #通过 CSR 请求

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

    在两个 node 节点上操作 

    1. #加载 ip_vs 模块
    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. #启动proxy服务
    4. cd /opt/
    5. ./proxy.sh 192.168.116.30

    6.部署 CNI 网络组件(使用 flannel)

    在 node01 节点上操作

    1. #上传 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目录中
    2. cd /opt/
    3. docker load -i flannel.tar
    4. mkdir /opt/cni/bin
    5. tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin

    在 master01 节点上操作

    1. #上传 kube-flannel.yml 文件到 /opt/k8s 目录中,部署 CNI 网络
    2. cd /opt/k8s
    3. kubectl apply -f kube-flannel.yml

    kubectl get pods -n kube-system        #查看pods指定命名空间

    kubectl get nodes        #查看节点状态(Ready即成功)

  • 相关阅读:
    存储器~Zynq book第九章
    地方/园区产业规划之 “ 如何进行产业定位 ”
    mysql 默认时间写入时差问题
    参加霍格沃兹测试开发学社举办的火焰杯软件测试开发大赛是一种什么体验?
    微信登录——授权登录获取用户信息
    JavaScript中常见问题及解决
    HTTP代理与HTTPS代理在工作流程上有哪些区别
    jvm垃圾回收算法有哪些及原理
    Net 如何获取私有属性
    Springboot科学养宠 omap1计算机毕业设计-课程设计-期末作业-毕设程序代做
  • 原文地址:https://blog.csdn.net/wlc1213812138/article/details/132683769