Linux系統中Kubernetes管理指南
systemctl stop firewalld && systemctl disable firewalld
)、禁用SELinux(sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0
)、關閉swap分區(swapoff -a
并注釋/etc/fstab
中的swap行);設置主機名與IP對應關系(編輯/etc/hosts
文件)。sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update && sudo apt install -y docker-ce
sudo systemctl enable --now docker
使用kubeadm
(官方推薦工具)、kubelet
(節點代理)、kubectl
(命令行工具):
sudo apt update && sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update && sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 鎖定版本避免自動升級
在Master節點執行初始化命令(以指定Pod網絡CIDR為例):
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=<Master_IP>
初始化完成后,按提示配置kubectl
:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Master節點初始化后會生成kubeadm join
命令(包含token和CA證書哈希),在Worker節點執行該命令即可加入集群:
sudo kubeadm join <Master_IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
Kubernetes需要網絡插件實現Pod間通信,常用Calico(適合生產環境):
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
驗證網絡插件是否正常:
kubectl get pods -n kube-system # 查看網絡插件Pod是否為Running狀態
Ready
):kubectl get nodes
kubectl get componentstatuses
Deployment
控制器部署Nginx示例:kubectl create deployment nginx --image=nginx:latest
NodePort
類型服務(外部可通過節點IP+端口訪問):kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods # 查看Pod狀態
kubectl get svc # 查看服務狀態
kubectl describe pod <pod_name> # 查看Pod詳情(排查問題)
kubectl scale deployment nginx --replicas=3
kubectl delete deployment nginx
kubectl logs <pod_name>
kubectl exec -it <pod_name> -- /bin/bash
使用Prometheus+Grafana組合監控集群性能:
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/datasource.yaml
admin
/admin
),導入Kubernetes監控Dashboard(如ID:3119)。使用**EFK(Elasticsearch+Fluentd+Kibana)**收集和分析日志:
kubectl apply -f https://raw.githubusercontent.com/elastic/elasticsearch-operator/master/deploy/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch.yaml
kubectl apply -f https://raw.githubusercontent.com/elastic/kibana/master/deploy/kubernetes/elasticsearch-kibana.yaml
logstash-*
)并查看日志。通過Role
和RoleBinding
限制用戶對資源的訪問權限,例如創建pod-reader
角色(允許讀取default
命名空間的Pod):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: alice # 用戶名(需提前創建)
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
通過NetworkPolicy
限制Pod間的通信,例如禁止所有Pod間的入站流量(默認拒絕):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {} # 選擇所有Pod
policyTypes:
- Ingress # 僅限制入站流量
- Egress # 可選:限制出站流量
使用kubeadm
升級集群(以升級到v1.28.0為例):
sudo kubeadm upgrade plan v1.28.0 # 檢查升級兼容性
sudo kubeadm upgrade apply v1.28.0 # 執行升級
升級后需重啟kubelet服務:
sudo systemctl restart kubelet
etcdctl
工具備份etcd數據:ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /opt/etcd-backup.db
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /opt/etcd-backup.db --data-dir=/var/lib/etcd-new
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
pip3 install -r requirements.txt
ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-nginx ingress-nginx/ingress-nginx