在CentOS上配置Kubernetes(k8s)的高可用性(HA)涉及多个组件和步骤。以下是一个基本的指南,帮助你在CentOS上设置一个高可用的Kubernetes集群。
在所有节点上安装必要的软件包:
sudo yum install -y epel-release
sudo yum update -y
sudo yum install -y kubelet kubeadm kubectl docker
确保Docker在所有节点上运行,并配置为使用systemd来管理容器:
sudo systemctl enable --now docker
sudo systemctl daemon-reload
在主节点上初始化Kubernetes集群:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
记录下输出的kubeadm join命令,稍后在从节点上使用。
在主节点上配置kubectl以便你可以管理集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
为了使Pod能够通信,你需要安装一个网络插件。这里以Calico为例:
kubectl apply -f https://docs.projectcalico.org/v3.25/manifests/calico.yaml
在每个工作节点上运行主节点输出的kubeadm join命令,将它们加入到集群中。
为了使控制平面高可用,你需要部署etcd集群。以下是一个基本的etcd部署示例:
apiVersion: v1
kind: ConfigMap
metadata:
  name: etcd-config
  namespace: kube-system
data:
  etcd.conf: |
    [server]
    initial-cluster = etcd-master=http://etcd-master:2380
    initial-advertise-peer-urls = http://etcd-master:2380
    listen-peer-urls = http://etcd-master:2380
    advertise-client-urls = http://etcd-master:2379
    listen-client-urls = http://etcd-master:2379
    initial-cluster-token = etcd-cluster-1
    initial-cluster-state = new
    quorum-read-only = false
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: etcd-data
  namespace: kube-system
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: etcd
  namespace: kube-system
spec:
  serviceName: "etcd"
  replicas: 3
  selector:
    matchLabels:
      app: etcd
  template:
    metadata:
      labels:
        app: etcd
    spec:
      containers:
      - name: etcd
        image: quay.io/coreos/etcd:v3.5.0
        command:
        - etcd
        - --name
        - $(POD_NAME)
        - --data-dir
        - /var/lib/etcd
        - --initial-advertise-peer-urls
        - http://etcd-$(POD_NAME).etcd:2380
        - --listen-peer-urls
        - http://etcd-$(POD_NAME).etcd:2380
        - --listen-client-urls
        - http://etcd-$(POD_NAME).etcd:2379
        - --advertise-client-urls
        - http://etcd-$(POD_NAME).etcd:2379
        - --initial-cluster
        - etcd-master=http://etcd-master:2380,etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380
        - --initial-cluster-token
        - etcd-cluster-1
        - --initial-cluster-state
        - new
        volumeMounts:
        - name: etcd-data
          mountPath: /var/lib/etcd
  volumeClaimTemplates:
  - metadata:
      name: etcd-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
将上述YAML文件保存为etcd-deployment.yaml,然后运行:
kubectl apply -f etcd-deployment.yaml
在每个节点上配置kubelet使用新的etcd集群:
sudo sed -i 's|KUBELET_EXTRA_ARGS="--pod-infra-container-image=registry.access.redhat.com/ubi8/pod-infrastructure:latest"|KUBELET_EXTRA_ARGS="--pod-infra-container-image=registry.access.redhat.com/ubi8/pod-infrastructure:latest --etcd-servers=https://etcd-master.etcd:2379,https://etcd-0.etcd:2379,https://etcd-1.etcd:2379,https://etcd-2.etcd:2379"|' /var/lib/kubelet/config.yaml
sudo systemctl restart kubelet
确保所有组件都正常运行:
kubectl get nodes
kubectl get pods --all-namespaces
通过以上步骤,你应该能够在CentOS上配置一个高可用的Kubernetes集群。请根据你的具体需求和环境进行调整。