以初学者的角度解释 Kubernetes the hard way – 设置控制平面组件

首先

我是YN,从30岁无经验开始努力学习成为工程师。
作为一个初学者的基础设施学习者,通过Kubernetes the hard way,我能够系统地学习有关基础设施的基本知识。
因此,我想在本文中总结一些从初学者的角度获得的学习经验。

目录

请查看这个。

控制面平面控制元件的配置

将API服务器、调度器和控制器管理器安装在每个主节点上。

安装

安装并部署kube-apiserve、kube-controller-manager、kube-scheduler、kubectl二进制文件。

sudo mkdir -p /etc/kubernetes/config
wget -q --show-progress --https-only --timestamping \
  "https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-apiserver" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-controller-manager" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kube-scheduler" \
  "https://storage.googleapis.com/kubernetes-release/release/v1.13.0/bin/linux/amd64/kubectl"

给予执行权限并移动到二进制文件夹↓

{
  chmod +x kube-apiserver kube-controller-manager kube-scheduler kubectl
  sudo mv kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/
}

进行etcd加密配置

Kubernetes集群的信息都存储在etcd数据库中,正如官方所述,我们需要对集群内保存的数据进行加密。

etcdデータベースには、Kubernetes APIを介してアクセス可能なあらゆる情報が含まれています。このため、暗号化ソリューションを活用してetcdのデータのバックアップを暗号化することや、EncryptionConfigurationを利用してデータを暗号化することが可能です。
参照

发布一个适当的密钥以进行加密。

生成一个随机的密钥,可以按照以下步骤进行。

ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

用“head -c 32”命令可以从文件头获取32个字节的信息。
“/dev”是一个伪设备文件夹,而”/dev/urandom”是一个永远产生随机数的文件。
因此,我们将提取32个字节的随机数并将其编码成base64格式,然后将其设置为密钥。

生成加密设置文件

在主节点上生成文件并共享。encryption-config.yaml将用于后续的API服务器配置。

cat > encryption-config.yaml <<EOF
kind: EncryptionConfig
apiVersion: v1
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: ${ENCRYPTION_KEY}
      - identity: {}
EOF
for instance in master-1 master-2; do
  scp encryption-config.yaml ${instance}:~/
done

API服务器的配置

スクリーンショット 2021-01-15 11.10.10.png

预先准备

{
  sudo mkdir -p /var/lib/kubernetes/

  sudo cp ca.crt ca.key kube-apiserver.crt kube-apiserver.key \
    service-account.key service-account.crt \
    etcd-server.key etcd-server.crt \
    encryption-config.yaml /var/lib/kubernetes/
}

获取主节点的内部IP地址(并将其存储到shell变量中)↓

INTERNAL_IP=$(ip addr show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f 1)

设定kube-apiserver.service文件。

配置systemd服务文件。

cat <<EOF | sudo tee /etc/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-apiserver \\
  --advertise-address=${INTERNAL_IP} \\
  --allow-privileged=true \\
  --apiserver-count=3 \\
  --audit-log-maxage=30 \\
  --audit-log-maxbackup=3 \\
  --audit-log-maxsize=100 \\
  --audit-log-path=/var/log/audit.log \\
  --authorization-mode=Node,RBAC \\
  --bind-address=0.0.0.0 \\
  --client-ca-file=/var/lib/kubernetes/ca.crt \\
  --enable-admission-plugins=NodeRestriction,ServiceAccount \\
  --enable-swagger-ui=true \\
  --enable-bootstrap-token-auth=true \\
  --etcd-cafile=/var/lib/kubernetes/ca.crt \\
  --etcd-certfile=/var/lib/kubernetes/etcd-server.crt \\
  --etcd-keyfile=/var/lib/kubernetes/etcd-server.key \\
  --etcd-servers=https://192.168.5.11:2379,https://192.168.5.12:2379 \\
  --event-ttl=1h \\
  --encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \\
  --kubelet-certificate-authority=/var/lib/kubernetes/ca.crt \\
  --kubelet-client-certificate=/var/lib/kubernetes/kube-apiserver.crt \\
  --kubelet-client-key=/var/lib/kubernetes/kube-apiserver.key \\
  --kubelet-https=true \\
  --runtime-config=api/all \\
  --service-account-key-file=/var/lib/kubernetes/service-account.crt \\
  --service-cluster-ip-range=10.96.0.0/24 \\
  --service-node-port-range=30000-32767 \\
  --tls-cert-file=/var/lib/kubernetes/kube-apiserver.crt \\
  --tls-private-key-file=/var/lib/kubernetes/kube-apiserver.key \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

这个配置描述了API服务器与其他组件之间的关系,这在整体结构中是可见的。其他值得注意的部分如下所示。

    –etcd-servers=https://192.168.5.11:2379,https://192.168.5.12:2379

我正在配置etcd服务器的冗余性。

–enable-admission-plugins=NodeRestriction,ServiceAccount:

我正在设置有关如何验证传输到API服务器的请求的方法。

准入控制器限制创建、删除、修改或连接(代理)请求。它们不支持读取请求。
准入控制流程分为两个阶段。第一阶段是运行可变准入控制器。第二阶段是运行验证准入控制器。再次注意,某些控制器同时具备可变和验证功能。
如果任何一个阶段的控制器拒绝请求,整个请求将立即被拒绝,并向最终用户返回错误信息。

    –authorization-mode=Node,RBAC

设置API服务器对Kubernetes组件授予的权限。参考。

控制器管理器的设置

スクリーンショット 2021-01-15 11.43.45.png

提前准备

sudo cp kube-controller-manager.kubeconfig /var/lib/kubernetes/

设置kube-controller-manager.service文件

cat <<EOF | sudo tee /etc/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-controller-manager \\
  --address=0.0.0.0 \\
  --cluster-cidr=192.168.5.0/24 \\
  --cluster-name=kubernetes \\
  --cluster-signing-cert-file=/var/lib/kubernetes/ca.crt \\
  --cluster-signing-key-file=/var/lib/kubernetes/ca.key \\
  --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\
  --leader-elect=true \\
  --root-ca-file=/var/lib/kubernetes/ca.crt \\
  --service-account-private-key-file=/var/lib/kubernetes/service-account.key \\
  --service-cluster-ip-range=10.96.0.0/24 \\
  --use-service-account-credentials=true \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

通过查看这个配置,我们可以看出对于整体控制器和其他组件之间的关系有着非常明确的描述。
此外,如果我们关注–leader-elect=true部分,我们可以知道Leader已经在master-1或者master-2节点中的一个上启动了。

日程调度器的设置

スクリーンショット 2021-01-15 11.49.01.png

准备工作

sudo cp kube-scheduler.kubeconfig /var/lib/kubernetes/

kube-scheduler.serviceファイルを設定する

cat <<EOF | sudo tee /etc/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-scheduler \\
  --kubeconfig=/var/lib/kubernetes/kube-scheduler.kubeconfig \\
  --address=127.0.0.1 \\
  --leader-elect=true \\
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

控制平面的启动

开始

{
  sudo systemctl daemon-reload
  sudo systemctl enable kube-apiserver kube-controller-manager kube-scheduler
  sudo systemctl start kube-apiserver kube-controller-manager kube-scheduler
}

确认行动

kubectl get componentstatuses --kubeconfig admin.kubeconfig
#もしくは kubectl get componentstatuses
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}
etcd-1               Healthy   {"health": "true"}

设置前端负载均衡器

スクリーンショット 2021-01-15 12.40.28.png

安置网络负载均衡器

vagrant ssh loadbalancer
#Install HAProxy
sudo apt-get update && sudo apt-get install -y haproxy
cat <<EOF | sudo tee /etc/haproxy/haproxy.cfg 
frontend kubernetes
    bind 192.168.5.30:6443
    option tcplog
    mode tcp
    default_backend kubernetes-master-nodes

backend kubernetes-master-nodes
    mode tcp
    balance roundrobin
    option tcp-check
    server master-1 192.168.5.11:6443 check fall 3 rise 2
    server master-2 192.168.5.12:6443 check fall 3 rise 2
EOF

HAproxyの設定については公式を参照ください。

    • frontend => 192.168.5.30:6443をlisten.後述のkubernetes-master-nodesバックエンドにセッションを接続させる

 

    backend => kubernetes-master-nodesバックエンドについて規定する。master-1/master-2にラウンドロビンでスケジューリング。ヘルスチェックは3回連続OKで健全、2回連続失敗でfailと判定。
sudo service haproxy restart

确认动作

# vagrantクラスタ外のターミナルからアクセス
curl  https://192.168.5.30:6443/version -k
{
  "major": "1",
  "minor": "13",
  "gitVersion": "v1.13.0",
  "gitCommit": "ddf47ac13c1a9483ea035a79cd7c10005ff21a6d",
  "gitTreeState": "clean",
  "buildDate": "2018-12-03T20:56:12Z",
  "goVersion": "go1.11.2",
  "compiler": "gc",
  "platform": "linux/amd64"
}
广告
将在 10 秒后关闭
bannerAds