版本信息

  1. Kubernetes v1.8.2
  2. Etcd v3.2.9
  3. Calico v2.6.2
  4. Docker v17.10.0-ce

预先准备信息

服务器信息

IP Address Role CPU Memory
192.168.170.170 test-xlx【master】 1 2G
192.168.170.171 test2【node1】 1 2G
192.168.170.172 test3【node2】 1 2G

简要说明

  1. master 为主要控制节点也是部署节点,node 为应用程序工作节点。

安装准备—所有节点都需要操作

  1. 确认关闭防火墙和selinux
  2. $ systemctl stop firewalld && systemctl disable firewalld
  3. $ setenforce 0
  4. $ vim /etc/selinux/config
  5. SELINUX=disabled
  6. 所有节点设置hosts
  7. [root@test3 ~]# cat /etc/hosts
  8. 192.168.170.170 test-xlx
  9. 192.168.170.171 test2
  10. 192.168.170.172 test3
  11. 所有节点需要安装Dockerrtk引擎。这边采用Docker来当作容器引擎,安装方式如下:
  12. curl -fsSL "https://get.docker.com/" | sh 【自动启动】
  13. systemctl enable docker && systemctl start docker
  14. 编辑/lib/systemd/system/docker.service,添加
  15. [root@test-xlx ~]# vim /lib/systemd/system/docker.service
  16. ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j ACCEPT
  17. [root@test-xlx ~]# systemctl daemon-reload
  18. [root@test-xlx ~]# systemctl restart docker.service
  19. 需要设定/etc/sysctl.d/k8s.conf的系统参数,将桥接的IPv4流量传递到iptables的链:
  20. cat <<EOF > /etc/sysctl.d/k8s.conf
  21. net.ipv4.ip_forward = 1
  22. net.bridge.bridge-nf-call-ip6tables = 1
  23. net.bridge.bridge-nf-call-iptables = 1
  24. EOF
  25. sysctl -p /etc/sysctl.d/k8s.conf

安装CFSSL工具

这将会用来建立 TLS certificates

  1. master节点操作
  2. export CFSSL_URL="https://pkg.cfssl.org/R1.2"
  3. wget "${CFSSL_URL}/cfssl_linux-amd64" -O /usr/local/bin/cfssl
  4. wget "${CFSSL_URL}/cfssljson_linux-amd64" -O /usr/local/bin/cfssljson
  5. chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson

提示:在开始安装 Kubernetes 之前,需要先将一些必要系统创建完成,其中 Etcd 就是 Kubernetes 最重要的一环,Kubernetes 会将大部分信息储存于 Etcd 上,来提供给其他节点索取,以确保整个集群运作与沟通正常。

创建集群 CA 与 Certificates

在这部分,将会需要产生 client 与 server 的各组件 certificates,并且替 Kubernetes admin user 产生 client 证书。

  1. 建立/etc/etcd/ssl文件夹,然后进入目录完成以下操作
  2. mkdir -p /etc/etcd/ssl && cd /etc/etcd/ssl
  3. export PKI_URL="https://kairen.github.io/files/manual-v1.8/pki"
  4. 下载ca-config.jsonetcd-ca-csr.json文件,并产生 CA 密钥:
  5. wget "${PKI_URL}/ca-config.json" "${PKI_URL}/etcd-ca-csr.json"【可能会无法下载】
  6. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  7. 代替方案生成ca-config.json文件 etcd-ca-csr.json文件
  8. cat <<EOF > ca-config.json
  9. {
  10. "signing": {
  11. "default": {
  12. "expiry": "87600h"
  13. },
  14. "profiles": {
  15. "kubernetes": {
  16. "usages": [
  17. "signing",
  18. "key encipherment",
  19. "server auth",
  20. "client auth"
  21. ],
  22. "expiry": "87600h"
  23. }
  24. }
  25. }
  26. }
  27. EOF
  28. cat <<EOF > etcd-ca-csr.json
  29. {
  30. "CN": "etcd",
  31. "key": {
  32. "algo": "rsa",
  33. "size": 2048
  34. },
  35. "names": [
  36. {
  37. "C": "SC",
  38. "ST": "ChengDu",
  39. "L": "ChengDu",
  40. "O": "etcd",
  41. "OU": "Etcd Security"
  42. }
  43. ]
  44. }
  45. EOF
  46. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  47. 生成证书
  48. cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca
  49. ------------------------------------------------------------------------------------------------------------------------------
  50. [root@test-xlx ssl]# cfssl gencert -initca etcd-ca-csr.json | cfssljson -bare etcd-ca
  51. 2021/03/14 00:59:33 [INFO] generating a new CA key and certificate from CSR
  52. 2021/03/14 00:59:33 [INFO] generate received request
  53. 2021/03/14 00:59:33 [INFO] received CSR
  54. 2021/03/14 00:59:33 [INFO] generating key: rsa-2048
  55. 2021/03/14 00:59:33 [INFO] encoded CSR
  56. 2021/03/14 00:59:33 [INFO] signed certificate with serial number 3757025824159786925659790574978323027931637352
  57. ------------------------------------------------------------------------------------------------------------------------------
  58. [root@test-xlx ssl]# ls /etc/etcd/ssl/
  59. ca-config.json etcd-ca.csr etcd-ca-csr.json etcd-ca-key.pem etcd-ca.pem
  60. 下载etcd-csr.json文件,并产生 kube-apiserver certificate 证书:
  61. wget "${PKI_URL}/etcd-csr.json"【可能无法下载】
  62. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  63. 代替方案生成etcd-csr.json文件
  64. cat <<EOF > etcd-csr.json
  65. {
  66. "CN": "etcd",
  67. "hosts": [
  68. "127.0.0.1",
  69. "192.168.170.171",
  70. "192.168.170.172"
  71. ],
  72. "key": {
  73. "algo": "rsa",
  74. "size": 2048
  75. },
  76. "names": [
  77. {
  78. "C": "SC",
  79. "ST": "ChengDu",
  80. "L": "ChengDu",
  81. "O": "etcd",
  82. "OU": "Etcd Security"
  83. }
  84. ]
  85. }
  86. EOF
  87. 注意hosts更换成自己的IP
  88. 生成证书
  89. 生成证书
  90. cfssl gencert \
  91. -ca=etcd-ca.pem \
  92. -ca-key=etcd-ca-key.pem \
  93. -config=ca-config.json \
  94. -profile=kubernetes \
  95. etcd-csr.json | cfssljson -bare etcd
  96. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  97. [root@test-xlx ssl]# cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd
  98. 2021/03/14 01:15:17 [INFO] generate received request
  99. 2021/03/14 01:15:17 [INFO] received CSR
  100. 2021/03/14 01:15:17 [INFO] generating key: rsa-2048
  101. 2021/03/14 01:15:18 [INFO] encoded CSR
  102. 2021/03/14 01:15:18 [INFO] signed certificate with serial number 457273308119455569510143983837366203361410694843
  103. 2021/03/14 01:15:18 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  104. websites. For more information see the Baseline Requirements for the Issuance and Management
  105. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  106. specifically, section 10.2.3 ("Information Requirements").
  107. ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  108. 可以删除不必要的json文件 也可以保留

Etcd 安装与设定—在master节点执行

  1. 首先在master1节点下载 Etcd,并解压缩放到 /opt 底下与安装:
  2. export ETCD_URL="https://github.com/coreos/etcd/releases/download"
  3. wget "${ETCD_URL}/v3.2.9/etcd-v3.2.9-linux-amd64.tar.gz"
  4. tar -zxvf etcd-v3.2.9-linux-amd64.tar.gz
  5. mv etcd-v3.2.9-linux-amd64/etcd* /usr/local/bin/ && rm -rf etcd-v3.2.9-linux-amd64
  6. 完成后新建 Etcd Group User,并建立 Etcd 配置文件目录:
  7. groupadd etcd && useradd -c "Etcd user" -g etcd -s /sbin/nologin -r etcd
  8. 下载etcd相关文件,我们将来管理 Etcd
  9. export ETCD_CONF_URL="https://kairen.github.io/files/manual-v1.8/master"【可能无法下载】
  10. wget "${ETCD_CONF_URL}/etcd.conf" -O /etc/etcd/etcd.conf
  11. wget "${ETCD_CONF_URL}/etcd.service" -O /lib/systemd/system/etcd.service
  12. ------------------------------------------------------------------------------------------------------
  13. 生成etcd.conf文件
  14. # cat /etc/etcd/etcd.conf
  15. # [member]
  16. ETCD_NAME=node170
  17. ETCD_DATA_DIR=/var/lib/etcd
  18. ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380
  19. ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379
  20. ETCD_PROXY=off
  21. # [cluster]
  22. ETCD_ADVERTISE_CLIENT_URLS=https://192.168.170.170:2379
  23. ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.170.170:2380
  24. ETCD_INITIAL_CLUSTER=node162=https://192.168.170.170:2380
  25. ETCD_INITIAL_CLUSTER_STATE=new
  26. ETCD_INITIAL_CLUSTER_TOKEN=etcd-k8s-cluster
  27. # [security]
  28. ETCD_CERT_FILE="/etc/etcd/ssl/etcd.pem"
  29. ETCD_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
  30. ETCD_CLIENT_CERT_AUTH="true"
  31. ETCD_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-ca.pem"
  32. ETCD_AUTO_TLS="true"
  33. ETCD_PEER_CERT_FILE="/etc/etcd/ssl/etcd.pem"
  34. ETCD_PEER_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
  35. ETCD_PEER_CLIENT_CERT_AUTH="true"
  36. ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-ca.pem"
  37. ETCD_PEER_AUTO_TLS="true"
  38. 生成etcd.service
  39. cat <<EOF > /lib/systemd/system/etcd.service
  40. [Unit]
  41. Description=Etcd Service
  42. After=network.target
  43. [Service]
  44. Environment=ETCD_DATA_DIR=/var/lib/etcd/default
  45. EnvironmentFile=-/etc/etcd/etcd.conf
  46. Type=notify
  47. User=etcd
  48. PermissionsStartOnly=true
  49. ExecStart=/usr/local/bin/etcd
  50. Restart=on-failure
  51. RestartSec=10
  52. LimitNOFILE=65536
  53. [Install]
  54. WantedBy=multi-user.target
  55. EOF
  56. ------------------------------------------------------------------------------------------------------
  57. 建立 var 存放信息,然后启动 Etcd 服务:
  58. mkdir -p /var/lib/etcd && chown etcd:etcd -R /var/lib/etcd /etc/etcd
  59. systemctl enable etcd.service && systemctl start etcd.service
  60. 通过简单指令验证:
  61. ETCDCTL_API=3 etcdctl \
  62. --cacert=${CA}/etcd-ca.pem \
  63. --cert=${CA}/etcd.pem \
  64. --key=${CA}/etcd-key.pem \
  65. --endpoints="https://127.0.0.1:2379" \
  66. endpoint health
  67. https://127.0.0.1:2379 is healthy: successfully committed proposal: took = 919.691µs

遗留问题

  1. etcd通过简单指令验证:
  2. ETCDCTL_API=3 etcdctl \
  3. --cacert=${CA}/etcd-ca.pem \
  4. --cert=${CA}/etcd.pem \
  5. --key=${CA}/etcd-key.pem \
  6. --endpoints="https://127.0.0.1:2379" \
  7. endpoint health
  8. 【本机地址不可以】
  9. https://192.168.170.170:2379 is unhealthy: failed to connect: grpc: timed out when dialing
  10. Error: unhealthy cluster

Kubernetes Master

Master 是 Kubernetes 的大总管,主要创建apiserver、Controller manager与Scheduler来组件管理所有 Node。本步骤将下载 Kubernetes 并安装至 master1上,然后产生相关 TLS Cert 与 CA 密钥,提供给集群组件认证使用。

下载 Kubernetes 组件

  1. 首先通过网络取得所有需要的执行文件:
  2. # Download Kubernetes
  3. export KUBE_URL="https://storage.googleapis.com/kubernetes-release/release/v1.8.2/bin/linux/amd64"
  4. wget "${KUBE_URL}/kubelet" -O /usr/local/bin/kubelet
  5. wget "${KUBE_URL}/kubectl" -O /usr/local/bin/kubectl
  6. chmod +x /usr/local/bin/kubelet /usr/local/bin/kubectl
  7. # Download CNI
  8. mkdir -p /opt/cni/bin && cd /opt/cni/bin
  9. export CNI_URL="https://github.com/containernetworking/plugins/releases/download"
  10. wget -qO --show-progress "${CNI_URL}/v0.6.0/cni-plugins-amd64-v0.6.0.tgz" | tar -zx
  11. wget https://github.com/containernetworking/plugins/releases/download/v0.6.0/cni-plugins-amd64-v0.6.0.tgz】
  12. [root@test-xlx bin]# tar -zxvf cni-plugins-amd64-v0.6.0.tgz
  13. [root@test-xlx bin]# ls
  14. bridge cni-plugins-amd64-v0.6.0.tgz dhcp flannel host-local ipvlan loopback macvlan portmap ptp sample tuning vlan

创建集群 CA 与 Certificates

在这部分,将会需要生成 client 与 server 的各组件 certificates,并且替 Kubernetes admin user 生成 client 证书。
创建pki文件夹,然后进入目录完成以下操作。

  1. mkdir -p /etc/kubernetes/pki && cd /etc/kubernetes/pki
  2. export PKI_URL="https://kairen.github.io/files/manual-v1.8/pki"
  3. export KUBE_APISERVER="https://192.168.170.170:6443"
  4. 下载ca-config.jsonca-csr.json文件,并生成 CA 密钥:
  5. wget "${PKI_URL}/ca-config.json" "${PKI_URL}/ca-csr.json"【可能无法下载】
  6. ls ca*.pem
  7. ca-key.pem ca.pem
  8. ———————————————————————————————————————————————————————————————————————————————————————————————————————
  9. 生成ca-config.json文件
  10. CA 配置文件用于配置根证书的使用场景 (profile) 和具体参数 (usage,过期时间、服务端认证、客户端认证、加密等):
  11. cat > ca-config.json <<EOF
  12. {
  13. "signing": {
  14. "default": {
  15. "expiry": "87600h"
  16. },
  17. "profiles": {
  18. "kubernetes": {
  19. "usages": [
  20. "signing",
  21. "key encipherment",
  22. "server auth",
  23. "client auth"
  24. ],
  25. "expiry": "876000h"
  26. }
  27. }
  28. }
  29. }
  30. EOF
  31. ######################################################################################################
  32. signing:表示该证书可用于签名其它证书(生成的ca.pem证书中CA=TRUE);
  33. server auth:表示 client 可以用该证书对 server 提供的证书进行验证;
  34. client auth:表示 server 可以用该证书对 client 提供的证书进行验证;
  35. expiry:876000h:证书有效期设置为 100 年。
  36. ######################################################################################################
  37. 生成 ca-csr.json 创建证书签名请求文件
  38. cat > ca-csr.json <<EOF
  39. {
  40. "CN": "kubernetes-ca",
  41. "key": {
  42. "algo": "rsa",
  43. "size": 2048
  44. },
  45. "names": [
  46. {
  47. "C": "CN",
  48. "ST": "BeiJing",
  49. "L": "BeiJing",
  50. "O": "k8s",
  51. "OU": "zhaoyixin"
  52. }
  53. ],
  54. "ca": {
  55. "expiry": "876000h"
  56. }
  57. }
  58. EOF
  59. [root@test-xlx pki]# ls /etc/kubernetes/pki/
  60. ca-config.json ca-csr.json
  61. cfssl gencert -initca ca-csr.json | cfssljson -bare ca 【生成 CA 密钥】
  62. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  63. [root@test-xlx pki]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  64. 2021/03/16 02:32:01 [INFO] generating a new CA key and certificate from CSR
  65. 2021/03/16 02:32:01 [INFO] generate received request
  66. 2021/03/16 02:32:01 [INFO] received CSR
  67. 2021/03/16 02:32:01 [INFO] generating key: rsa-2048
  68. 2021/03/16 02:32:02 [INFO] encoded CSR
  69. 2021/03/16 02:32:02 [INFO] signed certificate with serial number 37557834931298748572512819073885813630524656387
  70. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  71. ———————————————————————————————————————————————————————————————————————————————————————————————————————
  72. API server certificate
  73. 下载apiserver-csr.json文件,并生成 kube-apiserver certificate 证书:
  74. $ wget "${PKI_URL}/apiserver-csr.json" 【可能无法下载】
  75. $ cfssl gencert \
  76. -ca=ca.pem \
  77. -ca-key=ca-key.pem \
  78. -config=ca-config.json \
  79. -hostname=10.96.0.1,172.16.35.12,127.0.0.1,kubernetes.default \
  80. -profile=kubernetes \
  81. apiserver-csr.json | cfssljson -bare apiserver
  82. $ ls apiserver*.pem
  83. apiserver-key.pem apiserver.pe
  84. ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  85. 生成apiserver-csr.json
  86. [root@test-xlx pki]# cat apiserver-csr.json
  87. {
  88. "CN": "k8s-apiserver",
  89. "hosts": [
  90. "127.0.0.1",
  91. "192.168.0.1",
  92. "kubernetes.default",
  93. "kubernetes.default.svc",
  94. "kubernetes.default.svc.cluster",
  95. "kubernetes.default.svc.cluster.local",
  96. "192.168.170.170",
  97. "192.168.170.171",
  98. "192.168.170.172"
  99. ],
  100. "key": {
  101. "algo": "rsa",
  102. "size": 2048
  103. },
  104. "names": [
  105. {
  106. "C": "CN",
  107. "ST": "ShangHai",
  108. "L": "ShangHai",
  109. "O": "xy",
  110. "OU": "ops"
  111. }
  112. ]
  113. }
  114. ##################################################################################################################
  115. [root@test-xlx pki]# cfssl gencert \
  116. > -ca=ca.pem \
  117. > -ca-key=ca-key.pem \
  118. > -config=ca-config.json \
  119. > -hostname=10.96.0.1,172.16.35.12,127.0.0.1,kubernetes.default \
  120. > -profile=kubernetes \
  121. > apiserver-csr.json | cfssljson -bare apiserver
  122. 2021/03/16 02:50:05 [INFO] generate received request
  123. 2021/03/16 02:50:05 [INFO] received CSR
  124. 2021/03/16 02:50:05 [INFO] generating key: rsa-2048
  125. 2021/03/16 02:50:05 [INFO] encoded CSR
  126. 2021/03/16 02:50:05 [INFO] signed certificate with serial number 719572894668747476648756995718566282319980397122
  127. ##################################################################################################################
  128. [root@test-xlx pki]# ls apiserver*.pem
  129. apiserver-key.pem apiserver.pem
  130. [root@test-xlx pki]# ls
  131. apiserver.csr apiserver-csr.json apiserver-key.pem apiserver.pem ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem
  132. ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  133. Front proxy certificate
  134. 下载front-proxy-ca-csr.json文件,并生成 Front proxy CA 密钥,Front proxy 主要是用在 API aggregator 上:【可能无法下载】
  135. wget "${PKI_URL}/front-proxy-ca-csr.json"
  136. cfssl gencert \
  137. -initca front-proxy-ca-csr.json | cfssljson -bare front-proxy-ca
  138. ls front-proxy-ca*.pem
  139. front-proxy-ca-key.pem front-proxy-ca.pem
  140. 下载front-proxy-client-csr.json文件,并生成 front-proxy-client 证书:
  141. $ wget "${PKI_URL}/front-proxy-client-csr.json"
  142. $ cfssl gencert \
  143. -ca=front-proxy-ca.pem \
  144. -ca-key=front-proxy-ca-key.pem \
  145. -config=ca-config.json \
  146. -profile=kubernetes \
  147. front-proxy-client-csr.json | cfssljson -bare front-proxy-client
  148. $ ls front-proxy-client*.pem
  149. front-proxy-client-key.pem front-proxy-client.pem下载front-proxy-client-csr.json文件,并生成 front-proxy-client 证书:【可能无法下载】
  150. $ wget "${PKI_URL}/front-proxy-client-csr.json" 【可能无法下载】
  151. $ cfssl gencert \
  152. -ca=front-proxy-ca.pem \
  153. -ca-key=front-proxy-ca-key.pem \
  154. -config=ca-config.json \
  155. -profile=kubernetes \
  156. front-proxy-client-csr.json | cfssljson -bare front-proxy-client
  157. $ ls front-proxy-client*.pem
  158. front-proxy-client-key.pem front-proxy-client.pem

Bootstrap Token

http://docs.kubernetes.org.cn/713.html
由于通过手动创建 CA 方式太过繁杂,只适合少量机器,因为每次签证时都需要绑定 Node IP,随机器增加会带来很多困扰,因此这边使用 TLS Bootstrapping 方式进行授权,由 apiserver 自动给符合条件的 Node 发送证书来授权加入集群。
主要做法是 kubelet 启动时,向 kube-apiserver 传送 TLS Bootstrapping 请求,而 kube-apiserver 验证 kubelet 请求的 token 是否与设定的一样,若一样就自动产生 kubelet 证书与密钥。具体作法可以参考 TLS bootstrapping

  1. 首先建立一个变量来产生BOOTSTRAP_TOKEN,并建立 bootstrap.conf kubeconfig 文件:
  2. $ export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
  3. $ cat <<EOF > /etc/kubernetes/token.csv
  4. ${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
  5. EOF
  6. # bootstrap set-cluster
  7. cd /etc/kubernetes/pki
  8. kubectl config set-cluster kubernetes \
  9. --certificate-authority=ca.pem \
  10. --embed-certs=true \
  11. --server=${KUBE_APISERVER} \
  12. --kubeconfig=../bootstrap.conf
  13. ——————————————————————————————————————————————————————————————————————————————————————————
  14. [root@test-xlx pki]# kubectl config set-cluster kubernetes \
  15. --certificate-authority=ca.pem \
  16. --embed-certs=true \
  17. --server=${KUBE_APISERVER} \
  18. --kubeconfig=../bootstrap.conf
  19. Cluster "kubernetes" set.
  20. ——————————————————————————————————————————————————————————————————————————————————————————
  21. # bootstrap set-credentials
  22. $ kubectl config set-credentials kubelet-bootstrap \
  23. --token=${BOOTSTRAP_TOKEN} \
  24. --kubeconfig=../bootstrap.conf
  25. ___________________________________________________________________________________________
  26. [root@test-xlx pki]# kubectl config set-credentials kubelet-bootstrap \
  27. > --token=${BOOTSTRAP_TOKEN} \
  28. > --kubeconfig=../bootstrap.conf
  29. User "kubelet-bootstrap" set.
  30. ___________________________________________________________________________________________
  31. # bootstrap set-context
  32. $ kubectl config set-context default \
  33. --cluster=kubernetes \
  34. --user=kubelet-bootstrap \
  35. --kubeconfig=../bootstrap.conf
  36. ___________________________________________________________________________________________
  37. [root@test-xlx pki]# kubectl config set-context default \
  38. > --cluster=kubernetes \
  39. > --user=kubelet-bootstrap \
  40. > --kubeconfig=../bootstrap.conf
  41. Context "default" created.
  42. ___________________________________________________________________________________________
  43. # bootstrap set default context
  44. $ kubectl config use-context default --kubeconfig=../bootstrap.conf
  45. ___________________________________________________________________________________________
  46. [root@test-xlx pki]# kubectl config use-context default --kubeconfig=../bootstrap.conf
  47. Switched to context "default".
  48. ___________________________________________________________________________________________

Admin certificate

  1. 下载admin-csr.json文件,并生成 admin certificate 证书:
  2. $ wget "${PKI_URL}/admin-csr.json" 【可能无法下载】
  3. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. cat >> admin-csr.json << EOF
  5. {
  6. "CN": "kube-admin",
  7. "hosts": [
  8. "10.10.175.3"
  9. ],
  10. "key": {
  11. "algo": "rsa",
  12. "size": 2048
  13. },
  14. "names": [
  15. {
  16. "C": "CN",
  17. "ST": "Shanghai",
  18. "L": "Shanghai",
  19. "O": "system:masters",
  20. "OU": "System"
  21. }
  22. ]
  23. }
  24. EOF
  25. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  26. $ cfssl gencert \
  27. -ca=ca.pem \
  28. -ca-key=ca-key.pem \
  29. -config=ca-config.json \
  30. -profile=kubernetes \
  31. admin-csr.json | cfssljson -bare admin
  32. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  33. [root@test-xlx pki]# cfssl gencert \
  34. > -ca=ca.pem \
  35. > -ca-key=ca-key.pem \
  36. > -config=ca-config.json \
  37. > -profile=kubernetes \
  38. > admin-csr.json | cfssljson -bare admin
  39. > admin-csr.json | cfssljson -bare admin
  40. 2021/03/17 09:59:31 [INFO] generate received request
  41. 2021/03/17 09:59:31 [INFO] received CSR
  42. 2021/03/17 09:59:31 [INFO] generating key: rsa-2048
  43. 2021/03/17 09:59:31 [INFO] encoded CSR
  44. 2021/03/17 09:59:31 [INFO] signed certificate with serial number 632498633726938545834618549292840159760184158107
  45. 2021/03/17 09:59:31 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  46. websites. For more information see the Baseline Requirements for the Issuance and Management
  47. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  48. specifically, section 10.2.3 ("Information Requirements").
  49. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  50. [root@test-xlx pki]# ls admin*.pem
  51. admin-key.pem admin.pem
  52. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  53. [root@test-xlx pki]# ls
  54. admin.csr admin-key.pem apiserver.csr apiserver-key.pem ca-config.json ca-csr.json ca.pem
  55. admin-csr.json admin.pem apiserver-csr.json apiserver.pem ca.csr ca-key.pem
  56. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  57. 接着通过以下指令生成名称为 admin.conf kubeconfig 文件:
  58. # admin set-cluster
  59. $ kubectl config set-cluster kubernetes \
  60. --certificate-authority=ca.pem \
  61. --embed-certs=true \
  62. --server=${KUBE_APISERVER} \
  63. --kubeconfig=../admin.conf
  64. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  65. [root@test-xlx pki]# kubectl config set-cluster kubernetes \
  66. > --certificate-authority=ca.pem \
  67. > --embed-certs=true \
  68. > --server=${KUBE_APISERVER} \
  69. > --kubeconfig=../admin.conf
  70. Cluster "kubernetes" set.
  71. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  72. # admin set-credentials
  73. $ kubectl config set-credentials kubernetes-admin \
  74. --client-certificate=admin.pem \
  75. --client-key=admin-key.pem \
  76. --embed-certs=true \
  77. --kubeconfig=../admin.conf
  78. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  79. [root@test-xlx pki]# kubectl config set-credentials kubernetes-admin \
  80. > --client-certificate=admin.pem \
  81. > --client-key=admin-key.pem \
  82. > --embed-certs=true \
  83. > --kubeconfig=../admin.conf
  84. User "kubernetes-admin" set.
  85. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  86. # admin set-context
  87. $ kubectl config set-context kubernetes-admin@kubernetes \
  88. --cluster=kubernetes \
  89. --user=kubernetes-admin \
  90. --kubeconfig=../admin.conf
  91. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  92. [root@test-xlx pki]# kubectl config set-context kubernetes-admin@kubernetes \
  93. > --cluster=kubernetes \
  94. > --user=kubernetes-admin \
  95. > --kubeconfig=../admin.conf
  96. Context "kubernetes-admin@kubernetes" created.
  97. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  98. # admin set default context
  99. $ kubectl config use-context kubernetes-admin@kubernetes \
  100. --kubeconfig=../admin.conf
  101. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  102. [root@test-xlx pki]# kubectl config use-context kubernetes-admin@kubernetes \
  103. > --kubeconfig=../admin.conf
  104. Switched to context "kubernetes-admin@kubernetes".
  105. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————

Controller manager certificate

  1. 下载manager-csr.json文件,并生成 kube-controller-manager certificate 证书:
  2. $ wget "${PKI_URL}/manager-csr.json" 【可能无法下载】
  3. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. [root@test-xlx pki]# cat manager-csr.json
  5. {
  6. "CN": "system:kube-controller-manager",
  7. "key": {
  8. "algo": "rsa",
  9. "size": 2048
  10. },
  11. "hosts": [
  12. "127.0.0.1",
  13. "192.168.170.170"
  14. ],
  15. "names": [
  16. {
  17. "C": "CN",
  18. "ST": "Hubei",
  19. "L": "Wuhan",
  20. "O": "system:kube-controller-manager",
  21. "OU": "system"
  22. }
  23. ]
  24. }
  25. 若节点 IP 不同,需要修改manager-csr.jsonhosts
  26. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  27. $ cfssl gencert \
  28. -ca=ca.pem \
  29. -ca-key=ca-key.pem \
  30. -config=ca-config.json \
  31. -profile=kubernetes \
  32. manager-csr.json | cfssljson -bare controller-manager
  33. ——————————————————————————————————————————————————————————————————————————————————————————————————————————-——————————————————
  34. [root@test-xlx pki]# cfssl gencert \
  35. > -ca=ca.pem \
  36. > -ca-key=ca-key.pem \
  37. > -config=ca-config.json \
  38. > -profile=kubernetes \
  39. > manager-csr.json | cfssljson -bare controller-manager
  40. 2021/03/17 15:39:34 [INFO] generate received request
  41. 2021/03/17 15:39:34 [INFO] received CSR
  42. 2021/03/17 15:39:34 [INFO] generating key: rsa-2048
  43. 2021/03/17 15:39:35 [INFO] encoded CSR
  44. 2021/03/17 15:39:35 [INFO] signed certificate with serial number 261293080311829436818998124701626478945424524174
  45. 2021/03/17 15:39:35 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  46. websites. For more information see the Baseline Requirements for the Issuance and Management
  47. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  48. specifically, section 10.2.3 ("Information Requirements").
  49. ——————————————————————————————————————————————————————————————————————————————————————————————————————————-——————————————————
  50. [root@test-xlx pki]# ls controller-manager*.pem
  51. controller-manager-key.pem controller-manager.pem
  52. 接着通过以下指令生成名称为controller-manager.conf kubeconfig 文件:
  53. # controller-manager set-cluster
  54. $ kubectl config set-cluster kubernetes \
  55. --certificate-authority=ca.pem \
  56. --embed-certs=true \
  57. --server=${KUBE_APISERVER} \
  58. --kubeconfig=../controller-manager.conf
  59. # controller-manager set-credentials
  60. $ kubectl config set-credentials system:kube-controller-manager \
  61. --client-certificate=controller-manager.pem \
  62. --client-key=controller-manager-key.pem \
  63. --embed-certs=true \
  64. --kubeconfig=../controller-manager.conf
  65. # controller-manager set-context
  66. $ kubectl config set-context system:kube-controller-manager@kubernetes \
  67. --cluster=kubernetes \
  68. --user=system:kube-controller-manager \
  69. --kubeconfig=../controller-manager.conf
  70. # controller-manager set default context
  71. $ kubectl config use-context system:kube-controller-manager@kubernetes \
  72. --kubeconfig=../controller-manager.conf
  73. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  74. [root@test-xlx pki]# kubectl config set-cluster kubernetes \
  75. > --certificate-authority=ca.pem \
  76. > --embed-certs=true \
  77. > --server=${KUBE_APISERVER} \
  78. > --kubeconfig=../controller-manager.conf
  79. Cluster "kubernetes" set.
  80. [root@test-xlx pki]# kubectl config set-credentials system:kube-controller-manager \
  81. > --client-certificate=controller-manager.pem \
  82. > --client-key=controller-manager-key.pem \
  83. > --embed-certs=true \
  84. > --kubeconfig=../controller-manager.conf
  85. User "system:kube-controller-manager" set.
  86. [root@test-xlx pki]# kubectl config set-context system:kube-controller-manager@kubernetes \
  87. > --cluster=kubernetes \
  88. > --user=system:kube-controller-manager \
  89. > --kubeconfig=../controller-manager.conf
  90. Context "system:kube-controller-manager@kubernetes" created.
  91. [root@test-xlx pki]# kubectl config use-context system:kube-controller-manager@kubernetes \
  92. > --kubeconfig=../controller-manager.conf
  93. Switched to context "system:kube-controller-manager@kubernetes".
  94. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

Scheduler certificate

  1. 下载scheduler-csr.json文件,并生成 kube-scheduler certificate 证书:
  2. wget "${PKI_URL}/scheduler-csr.json"【可能无法下载】
  3. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. 生成scheduler-csr.json配置文件
  5. [root@test-xlx pki]# pwd
  6. /etc/kubernetes/pki
  7. cat >> scheduler-csr.json << EOF
  8. {
  9. "CN": "system:kube-scheduler",
  10. "hosts": [
  11. "192.168.170.170",
  12. "192.168.170.171",
  13. "192.168.170.172"
  14. ],
  15. "key": {
  16. "algo": "rsa",
  17. "size": 2048
  18. },
  19. "names": [
  20. {
  21. "C": "CN",
  22. "ST": "Shanghai",
  23. "L": "Shanghai",
  24. "O": "system:kube-scheduler",
  25. "OU": "System"
  26. }
  27. ]
  28. }
  29. EOF
  30. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  31. cfssl gencert \
  32. -ca=ca.pem \
  33. -ca-key=ca-key.pem \
  34. -config=ca-config.json \
  35. -profile=kubernetes \
  36. scheduler-csr.json | cfssljson -bare scheduler
  37. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  38. [root@test-xlx pki]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes scheduler-csr.json | cfssljson -bare scheduler
  39. 2021/03/26 07:40:56 [INFO] generate received request
  40. 2021/03/26 07:40:56 [INFO] received CSR
  41. 2021/03/26 07:40:56 [INFO] generating key: rsa-2048
  42. 2021/03/26 07:40:56 [INFO] encoded CSR
  43. 2021/03/26 07:40:56 [INFO] signed certificate with serial number 715503307064271558981204673099714115916622820615
  44. 2021/03/26 07:40:56 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  45. websites. For more information see the Baseline Requirements for the Issuance and Management
  46. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  47. specifically, section 10.2.3 ("Information Requirements").
  48. 【若节点 IP 不同,需要修改scheduler-csr.jsonhosts。】
  49. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  50. [root@test-xlx pki]# ls scheduler*.pem
  51. scheduler-key.pem scheduler.pem

接着通过以下指令生成名称为 scheduler.conf 的 kubeconfig 文件

  1. # scheduler set-cluster
  2. $ kubectl config set-cluster kubernetes \
  3. --certificate-authority=ca.pem \
  4. --embed-certs=true \
  5. --server=${KUBE_APISERVER} \
  6. --kubeconfig=../scheduler.conf
  7. # scheduler set-credentials
  8. $ kubectl config set-credentials system:kube-scheduler \
  9. --client-certificate=scheduler.pem \
  10. --client-key=scheduler-key.pem \
  11. --embed-certs=true \
  12. --kubeconfig=../scheduler.conf
  13. # scheduler set-context
  14. $ kubectl config set-context system:kube-scheduler@kubernetes \
  15. --cluster=kubernetes \
  16. --user=system:kube-scheduler \
  17. --kubeconfig=../scheduler.conf
  18. # scheduler set default context
  19. $ kubectl config use-context system:kube-scheduler@kubernetes \
  20. --kubeconfig=../scheduler.conf
  21. ————————————————————————————————————————————————————————————————————————————————————————————————————————
  22. [root@test-xlx pki]# kubectl config set-cluster kubernetes \
  23. > --certificate-authority=ca.pem \
  24. > --embed-certs=true \
  25. > --server=${KUBE_APISERVER} \
  26. > --kubeconfig=../scheduler.conf
  27. Cluster "kubernetes" set.
  28. [root@test-xlx pki]# kubectl config set-credentials system:kube-scheduler \
  29. > --client-certificate=scheduler.pem \
  30. > --client-key=scheduler-key.pem \
  31. > --embed-certs=true \
  32. > --kubeconfig=../scheduler.conf
  33. User "system:kube-scheduler" set.
  34. [root@test-xlx pki]# kubectl config set-context system:kube-scheduler@kubernetes \
  35. > --cluster=kubernetes \
  36. > --user=system:kube-scheduler \
  37. > --kubeconfig=../scheduler.conf
  38. Context "system:kube-scheduler@kubernetes" created.
  39. [root@test-xlx pki]# kubectl config use-context system:kube-scheduler@kubernetes \
  40. > --kubeconfig=../scheduler.conf
  41. Switched to context "system:kube-scheduler@kubernetes".
  42. ————————————————————————————————————————————————————————————————————————————————————————————————————————

Kubelet master certificate

  1. 下载kubelet-csr.json文件,并生成 master node certificate 证书:
  2. wget "${PKI_URL}/kubelet-csr.json"【可能无法下载】
  3. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4. cat >> kubelet-csr.json << EOF
  5. {
  6. "CN": "system:node:master01",
  7. "hosts": [
  8. "test-xlx",
  9. "192.168.170.170"
  10. ],
  11. "key": {
  12. "algo": "rsa",
  13. "size": 2048
  14. },
  15. "names": [
  16. {
  17. "C": "CN",
  18. "L": "Shanghai",
  19. "ST": "Shanghai",
  20. "O": "system:nodes",
  21. "OU": "Kubernetes-manual"
  22. }
  23. ]
  24. }
  25. EOF
  26. sed -i 's/$NODE/test-xlx/g' kubelet-csr.json
  27. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  28. cfssl gencert \
  29. -ca=ca.pem \
  30. -ca-key=ca-key.pem \
  31. -config=ca-config.json \
  32. -hostname=test-xlx,192.168.170.170,192.168.170.170 \
  33. -profile=kubernetes \
  34. kubelet-csr.json | cfssljson -bare kubelet
  35. 【这边$NODE需要随节点名称不同而改变。】
  36. ______________________________________________________________________________________________________________________
  37. [root@test-xlx pki]# cfssl gencert \
  38. > -ca=ca.pem \
  39. > -ca-key=ca-key.pem \
  40. > -config=ca-config.json \
  41. > -hostname=test-xlx,192.168.170.170,192.168.170.170 \
  42. > -profile=kubernetes \
  43. > kubelet-csr.json | cfssljson -bare kubelet
  44. 2021/03/26 07:49:20 [INFO] generate received request
  45. 2021/03/26 07:49:20 [INFO] received CSR
  46. 2021/03/26 07:49:20 [INFO] generating key: rsa-2048
  47. 2021/03/26 07:49:20 [INFO] encoded CSR
  48. 2021/03/26 07:49:20 [INFO] signed certificate with serial number 21765872373764965684739476885736354706459574089
  49. ______________________________________________________________________________________________________________________
  50. [root@test-xlx pki]# ls kubelet*.pem
  51. kubelet-key.pem kubelet.pem
  52. 接着通过以下指令生成名称为 kubelet.conf kubeconfig 文件:
  53. $ kubectl config set-cluster kubernetes \
  54. --certificate-authority=ca.pem \
  55. --embed-certs=true \
  56. --server=${KUBE_APISERVER} \
  57. --kubeconfig=../kubelet.conf
  58. # kubelet set-credentials
  59. $ kubectl config set-credentials system:node:test-xlx \
  60. --client-certificate=kubelet.pem \
  61. --client-key=kubelet-key.pem \
  62. --embed-certs=true \
  63. --kubeconfig=../kubelet.conf
  64. # kubelet set-context
  65. $ kubectl config set-context system:node:test-xlx@kubernetes \
  66. --cluster=kubernetes \
  67. --user=system:node:test-xlx \
  68. --kubeconfig=../kubelet.conf
  69. # kubelet set default context
  70. $ kubectl config use-context system:node:test-xlx@kubernetes \
  71. --kubeconfig=../kubelet.conf
  72. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
  73. [root@test-xlx pki]# kubectl config set-cluster kubernetes \
  74. > --certificate-authority=ca.pem \
  75. > --embed-certs=true \
  76. > --server=${KUBE_APISERVER} \
  77. > --kubeconfig=../kubelet.conf
  78. [root@test-xlx pki]# kubectl config set-credentials system:node:test-xlx \
  79. > --client-certificate=kubelet.pem \
  80. > --client-key=kubelet-key.pem \
  81. > --embed-certs=true \
  82. > --kubeconfig=../kubelet.conf
  83. User "system:node:test-xlx" set.
  84. [root@test-xlx pki]# kubectl config set-context system:node:test-xlx@kubernetes \
  85. > --cluster=kubernetes \
  86. > --user=system:node:test-xlx \
  87. > --kubeconfig=../kubelet.conf
  88. Context "system:node:test-xlx@kubernetes" created.
  89. [root@test-xlx pki]# kubectl config use-context system:node:test-xlx@kubernetes \
  90. > --kubeconfig=../kubelet.conf
  91. Switched to context "system:node:test-xlx@kubernetes".
  92. ——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

Service account key

  1. Service account 不是通过 CA 进行认证,因此不要通过 CA 来做 Service account key 的检查,这边建立一组 Private Public 密钥提供给 Service account key 使用:
  2. [root@test-xlx pki]# openssl genrsa -out sa.key 2048
  3. [root@test-xlx pki]# openssl rsa -in sa.key -pubout -out sa.pub
  4. __________________________________________________________________________________________________________________________________________________________
  5. [root@test-xlx pki]# openssl genrsa -out sa.key 2048
  6. Generating RSA private key, 2048 bit long modulus
  7. ...........+++
  8. .........+++
  9. e is 65537 (0x10001)
  10. [root@test-xlx pki]# openssl rsa -in sa.key -pubout -out sa.pub
  11. writing RSA key
  12. __________________________________________________________________________________________________________________________________________________________
  13. [root@test-xlx pki]# ls sa.*
  14. sa.key sa.pub

确认/etc/kubernetes与/etc/kubernetes/pki有以下文件:

  1. ls /etc/kubernetes/
  2. admin.conf bootstrap.conf controller-manager.conf kubelet.conf pki scheduler.conf token.csv
  3. ls /etc/kubernetes/pki
  4. admin-key.pem apiserver-key.pem ca-key.pem controller-manager-key.pem front-proxy-ca-key.pem front-proxy-client-key.pem kubelet-key.pem sa.key scheduler-key.pem
  5. admin.pem apiserver.pem ca.pem controller-manager.pem front-proxy-ca.pem front-proxy-client.pem kubelet.pem sa.pub scheduler.pem

安装 Kubernetes 核心组件

  1. 首先下载 Kubernetes 核心组件 YAML 文件,这边我们不透过 Binary 方案来创建 Master 核心组件,
  2. 而是利用 Kubernetes Static Pod 来创建,因此需下载所有核心组件的Static Pod文件到/etc/kubernetes/manifests目录:
  3. [root@test-xlx pki]# export CORE_URL="https://kairen.github.io/files/manual-v1.8/master"
  4. [root@test-xlx pki]# mkdir -p /etc/kubernetes/manifests && cd /etc/kubernetes/manifests

image.png

在master1将kube-proxy相关文件复制到 Node 节点上

  1. slave1 slave2,新建
  2. [root@test3 ~]# mkdir /etc/kubernetes
  3. for NODE in test2 test3; do
  4. for FILE in pki/kube-proxy.pem pki/kube-proxy-key.pem kube-proxy.conf; do
  5. scp /etc/kubernetes/${FILE} ${NODE}:/etc/kubernetes/${FILE}
  6. done
  7. done