Artikelverzeichnis
-
- 1. Erstellen Sie ein Arbeitsverzeichnis und kopieren Sie die Binärdatei
- 2 Kubelet bereitstellen (Masterknotenbetrieb)
- 3 Genehmigen Sie den Kubelet-Zertifikatsantrag und treten Sie dem Cluster bei
- 4 Kube-Proxy bereitstellen (Masterknotenbetrieb)
- 5 CNI-Netzwerk bereitstellen (Masterknotenbetrieb)
- 6 Autorisieren Sie den Apiserver für den Zugriff auf Kubelet (Masterknotenbetrieb).
- 7 Neuer Worker-Knoten hinzugefügt
-
-
- 7.1 Kopieren Sie die bereitgestellten knotenbezogenen Dateien auf den neuen Knoten
- 7.2 Löschen Sie das Kubelet-Zertifikat und die kubeconfig-Datei
- 7.3 Hostnamen ändern
- 7.4 Starten und Startup einstellen
- 7.5 Genehmigen Sie den neuen Knoten-Kubelet-Zertifikatantrag auf dem Master
- 7.6 Knotenstatus anzeigen
-
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!