Kubernetes-Cluster-Bereitstellung – Bereitstellung von Worker-Knoten (4)


Als nächstes operieren wir noch auf dem Master Node, der auch als Worker Node dient.

1. Erstellen Sie ein Arbeitsverzeichnis und kopieren Sie die Binärdatei

Erstellen Sie Arbeitsverzeichnisse auf allen Worker-Knoten: (Knotenvorgang)

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

Vom Master-Knoten kopieren: (Master-Knoten-Vorgang)

cd /opt/tools/kubernetes/server/bin/
cp kubelet  kube-proxy /opt/kubernetes/bin/

scp kubelet  kube-proxy k8s-node1:/opt/kubernetes/bin/
scp kubelet  kube-proxy k8s-node2:/opt/kubernetes/bin/

2 Kubelet bereitstellen (Masterknotenbetrieb)

2.1 Konfigurationsdatei erstellen
cat > /opt/kubernetes/cfg/kubelet.conf << EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=k8s-master \\
--network-plugin=cni \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet-config.yml \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0"
EOF
  • –hostname-override: Anzeigename, eindeutig im Cluster
  • –Netzwerk-Plugin: CNI aktivieren
  • –kubeconfig: leerer Pfad, der automatisch generiert und später für die Verbindung zum Apiserver verwendet wird
  • –bootstrap-kubeconfig: Beantragen Sie beim ersten Start ein Zertifikat vom Apiserver
  • –config: Konfigurationsparameterdatei
  • –cert-dir: Verzeichnis zur Erzeugung des Kubelet-Zertifikats
  • –pod-infra-container-image: verwaltet das Image des Pod-Netzwerkcontainers
2.2 Konfigurationsparameterdatei
cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- 10.0.0.2
clusterDomain: cluster.local 
failSwapOn: false
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /opt/kubernetes/ssl/ca.pem 
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
evictionHard:
  imagefs.available: 15%
  memory.available: 100Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110
EOF
2.3 Generieren Sie die Datei „bootstrap.kubeconfig“.
KUBE_APISERVER="https://10.20.17.20:6443" # apiserver IP:PORT
TOKEN="063e91e42837f2a2b36860457f515053" # 与token.csv里保持一致

cd /root/TLS/k8s

# 生成 kubelet bootstrap kubeconfig 配置文件
kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=bootstrap.kubeconfig
  
kubectl config set-credentials "kubelet-bootstrap" \
  --token=${TOKEN} \
  --kubeconfig=bootstrap.kubeconfig
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user="kubelet-bootstrap" \
  --kubeconfig=bootstrap.kubeconfig
  
  
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig

In den Pfad der Konfigurationsdatei kopieren:

cp /root/TLS/k8s/bootstrap.kubeconfig /opt/kubernetes/cfg
2.4 systemd verwaltet Kubelet
cat > /usr/lib/systemd/system/kubelet.service << EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
2.5 Starten und Startup einstellen
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet

Hinweis: Wenn es nicht gestartet werden kann, können Sie das Systemprotokoll überprüfen, um die Ursache des Problems zu ermitteln: cat /var/log/messages

3 Genehmigen Sie den Kubelet-Zertifikatsantrag und treten Sie dem Cluster bei

# 查看kubelet证书请求
[root@k8s-master ~]# kubectl get csr
NAME                                                   AGE     SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-LHEDjWtPT39E8gkKemznF7a5GgEfX4Y5Q34E-MgzJbw   9m53s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending

# 批准申请
kubectl certificate approve node-csr-LHEDjWtPT39E8gkKemznF7a5GgEfX4Y5Q34E-MgzJbw

# 查看节点
[root@k8s-master ~]# kubectl get node
NAME         STATUS     ROLES    AGE   VERSION
k8s-master   NotReady   <none>   21s   v1.18.3

Hinweis: Da das Netzwerk-Plug-in noch nicht bereitgestellt wurde, ist der Knoten nicht bereit (NotReady).

4 Kube-Proxy bereitstellen (Masterknotenbetrieb)

4.1 Konfigurationsdatei erstellen
cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--config=/opt/kubernetes/cfg/kube-proxy-config.yml"
EOF
4.2 Konfigurationsparameterdatei
cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
kind: KubeProxyConfiguration
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
metricsBindAddress: 0.0.0.0:10249
clientConnection:
  kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
hostnameOverride: k8s-master
clusterCIDR: 10.0.0.0/24
EOF
4.3 Generieren Sie die Datei kube-proxy.kubeconfig

Kube-Proxy-Zertifikat generieren:

# 切换工作目录
cd /root/TLS/k8s

# 创建证书请求文件
cat > kube-proxy-csr.json << EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF

# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

# ls kube-proxy*pem
kube-proxy-key.pem  kube-proxy.pem

Kubeconfig-Datei generieren:


KUBE_APISERVER="https://10.20.17.20:6443"

cd /root/TLS/k8s

kubectl config set-cluster kubernetes \
  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig
  
kubectl config set-credentials kube-proxy \
  --client-certificate=./kube-proxy.pem \
  --client-key=./kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
  
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
  
  
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

Kopieren Sie in den angegebenen Pfad in der Konfigurationsdatei:

cp /root/TLS/k8s/kube-proxy.kubeconfig /opt/kubernetes/cfg/
4.4 systemd verwaltet kube-proxy
cat > /usr/lib/systemd/system/kube-proxy.service << EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
4.5 Starten und Startup einstellen
systemctl daemon-reload
systemctl start kube-proxy
systemctl enable kube-proxy

5 CNI-Netzwerk bereitstellen (Masterknotenbetrieb)

5.1 CNI-Binärdateien vorbereiten

Download-Adresse: https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz

5.2 Entpacken Sie das Binärpaket und verschieben Sie es in das Standardarbeitsverzeichnis
mkdir -p /opt/cni/bin
cd /opt/tools/
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
5.3 CNI-Netzwerk bereitstellen
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 若默认镜像地址无法访问,修改为docker hub镜像仓库。此处我们不进行修改
sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yml

Flanell-Netzwerkcontainer generieren:

# kubectl apply -f kube-flannel.yml

# kubectl get pods -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
kube-flannel-ds-amd64-c4t2v   1/1     Running   0          25s

# kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    <none>   36m   v1.18.3

Stellen Sie das Netzwerk-Plug-in bereit und Node ist bereit.

6 Autorisieren Sie den Apiserver für den Zugriff auf Kubelet (Masterknotenbetrieb).

cat > apiserver-to-kubelet-rbac.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kube-apiserver-to-kubelet
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/proxy
      - nodes/stats
      - nodes/log
      - nodes/spec
      - nodes/metrics
      - pods/log
    verbs:
      - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kube-apiserver
  namespace: ""
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kube-apiserver-to-kubelet
subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: kubernetes
EOF

kubectl apply -f apiserver-to-kubelet-rbac.yaml

7 Neuer Worker-Knoten hinzugefügt

7.1 Kopieren Sie die bereitgestellten knotenbezogenen Dateien auf den neuen Knoten

Master-Knoten-Vorgang
Kopieren Sie die Worker-Knoten-bezogenen Dateien auf die neuen Knoten auf dem Master-Knoten: Knoten1, Knoten2

scp -r /opt/kubernetes k8s-node1:/opt/
scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service k8s-node1:/usr/lib/systemd/system
scp -r /opt/cni/ k8s-node1:/opt/
scp /opt/kubernetes/ssl/ca.pem k8s-node1:/opt/kubernetes/ssl
7.2 Löschen Sie das Kubelet-Zertifikat und die kubeconfig-Datei

Knotenknotenbetrieb

rm /opt/kubernetes/cfg/kubelet.kubeconfig 
rm -f /opt/kubernetes/ssl/kubelet*

Hinweis: Diese Dateien werden automatisch generiert, nachdem der Zertifikatsantrag genehmigt wurde. Jeder Knoten ist anders und muss gelöscht und neu generiert werden.

7.3 Hostnamen ändern

Knotenknotenbetrieb

vim /opt/kubernetes/cfg/kubelet.conf
--hostname-override=k8s-node1

vim /opt/kubernetes/cfg/kube-proxy-config.yml
hostnameOverride: k8s-node1
7.4 Starten und Startup einstellen

Knotenknotenbetrieb

systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
systemctl start kube-proxy
systemctl enable kube-proxy
7.5 Genehmigen Sie den neuen Knoten-Kubelet-Zertifikatantrag auf dem Master

Betrieb des Masterknotens

# kubectl get csr
NAME                                                   AGE   SIGNERNAME                                    REQUESTOR           CONDITION
node-csr-LHEDjWtPT39E8gkKemznF7a5GgEfX4Y5Q34E-MgzJbw   68m   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Approved,Issued
node-csr-eFXMlBTEP1jYeRrMur_ZdpMeWyKmtyQ-A_LGOQZ74a0   57s   kubernetes.io/kube-apiserver-client-kubelet   kubelet-bootstrap   Pending

kubectl certificate approve node-csr-eFXMlBTEP1jYeRrMur_ZdpMeWyKmtyQ-A_LGOQZ74a0
7.6 Knotenstatus anzeigen

Betrieb des Masterknotens

[root@k8s-master ~]# kubectl get node
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    <none>   60m   v1.18.3
k8s-node1    Ready    <none>   62s   v1.18.3

Hinweis: Wenn der Status des neu hinzugefügten Knotens NotReady ist, können Sie verwendenjournalctl -f -u kubeletÜberprüfen Sie das Problem, wenn der folgende Fehler gemeldet wird:

 Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

Dieses Problem besteht darin, dass das Netzwerk-Plugin noch nicht bereit ist. Wir können den Befehl ausführenDocker-Bilder|grep flannelÜberprüfen wir, ob das Flanell-Image erfolgreich abgerufen wurde. Nach der Untersuchung ist das Abrufen des Flanell-Images etwas langsam. Warten Sie eine Weile oder führen Sie den Befehl manuell aus, um das Image herunterzuladen:Docker Pull quay.io/coreos/flannel:v0.12.0-amd64

Wenn Sie mit dem Hinzufügen von Knoten 2 fortfahren müssen, gehen Sie wie oben vor. Denken Sie daran, den Hostnamen zu ändern!

Supongo que te gusta

Origin blog.csdn.net/cljdsc/article/details/134758668
Recomendado
Clasificación