活动公告

系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

详解 AlmaLinux 系统 Kubernetes 集成步骤与最佳实践指南 从环境准备到集群部署的完整教程 助您轻松搭建企业级容器平台

SunJu_FaceMall

3万

主题

2720

科技点

3万

积分

执行版主

碾压王

积分
32881

塔罗立华奏

执行版主 发表于 2025-8-31 14:20:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 引言

AlmaLinux是一个开源的、社区拥有的企业级Linux发行版,作为CentOS的替代方案而诞生,完全兼容RHEL(Red Hat Enterprise Linux)。Kubernetes是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。在AlmaLinux上部署Kubernetes可以获得稳定、安全、高性能的企业级容器平台。

本指南将详细介绍在AlmaLinux系统上部署Kubernetes集群的完整过程,从环境准备到集群部署,再到最佳实践,帮助您轻松搭建企业级容器平台。

2. 环境准备

2.1 系统要求

在开始部署Kubernetes集群之前,需要确保您的系统满足以下最低要求:

• 至少2台或更多的服务器(一个Master节点,一个或多个Worker节点)
• 每台服务器至少2GB RAM(推荐4GB或更多)
• 每台服务器至少2个CPU核心
• 每台服务器至少20GB的磁盘空间
• 所有节点之间的网络连接正常

2.2 主机准备

假设我们有以下三台服务器:

• Master节点: 192.168.1.10, hostname: k8s-master
• Worker节点1: 192.168.1.11, hostname: k8s-worker1
• Worker节点2: 192.168.1.12, hostname: k8s-worker2

在所有节点上执行以下操作:
  1. # 在Master节点上
  2. sudo hostnamectl set-hostname k8s-master
  3. # 在Worker节点1上
  4. sudo hostnamectl set-hostname k8s-worker1
  5. # 在Worker节点2上
  6. sudo hostnamectl set-hostname k8s-worker2
复制代码

在所有节点上编辑/etc/hosts文件,添加以下内容:
  1. 192.168.1.10   k8s-master
  2. 192.168.1.11   k8s-worker1
  3. 192.168.1.12   k8s-worker2
复制代码

Kubernetes和某些网络插件可能与防火墙和SELinux冲突,为了简化部署过程,我们先关闭它们:
  1. # 关闭防火墙
  2. sudo systemctl stop firewalld
  3. sudo systemctl disable firewalld
  4. # 关闭SELinux
  5. sudo setenforce 0
  6. sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
复制代码

Kubernetes不推荐使用swap,需要禁用它:
  1. sudo swapoff -a
  2. sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
复制代码

创建/etc/sysctl.d/k8s.conf文件,添加以下内容:
  1. cat << EOF | sudo tee /etc/sysctl.d/k8s.conf
  2. net.bridge.bridge-nf-call-ip6tables = 1
  3. net.bridge.bridge-nf-call-iptables = 1
  4. net.ipv4.ip_forward = 1
  5. EOF
复制代码

应用这些参数:
  1. sudo sysctl --system
复制代码
  1. sudo yum update -y
  2. sudo yum install -y yum-utils device-mapper-persistent-data lvm2
复制代码

3. 软件安装

3.1 安装Docker

Kubernetes支持多种容器运行时,Docker是最常用的一种。在所有节点上执行以下步骤安装Docker:
  1. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
复制代码
  1. sudo yum install -y docker-ce docker-ce-cli containerd.io
复制代码

创建/etc/docker/daemon.json文件,添加以下内容:
  1. cat << EOF | sudo tee /etc/docker/daemon.json
  2. {
  3.   "exec-opts": ["native.cgroupdriver=systemd"],
  4.   "log-driver": "json-file",
  5.   "log-opts": {
  6.     "max-size": "100m"
  7.   },
  8.   "storage-driver": "overlay2"
  9. }
  10. EOF
复制代码
  1. sudo systemctl enable docker
  2. sudo systemctl start docker
复制代码

3.2 安装kubeadm、kubelet和kubectl

在所有节点上执行以下步骤安装Kubernetes组件:

创建/etc/yum.repos.d/kubernetes.repo文件,添加以下内容:
  1. cat << EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
  5. enabled=1
  6. gpgcheck=1
  7. repo_gpgcheck=1
  8. gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
  9. exclude=kubelet kubeadm kubectl
  10. EOF
复制代码
  1. sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
复制代码
  1. sudo systemctl enable kubelet
  2. sudo systemctl start kubelet
复制代码

4. 集群初始化

在Master节点上执行以下步骤初始化Kubernetes集群:

4.1 初始化控制平面
  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.1.10
复制代码

这里的--pod-network-cidr参数指定了Pod网络的CIDR,我们使用10.244.0.0/16,这是Flannel网络插件默认使用的CIDR。--apiserver-advertise-address参数指定了API Server的广告地址,通常设置为Master节点的IP地址。

初始化完成后,会显示类似以下的输出:
  1. Your Kubernetes control-plane has initialized successfully!
  2. To start using your cluster, you need to run the following as a regular user:
  3.   mkdir -p $HOME/.kube
  4.   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5.   sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. Alternatively, if you are the root user, you can run:
  7.   export KUBECONFIG=/etc/kubernetes/admin.conf
  8. You should now deploy a pod network to the cluster.
  9. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  10.   https://kubernetes.io/docs/concepts/cluster-administration/addons/
  11. Then you can join any number of worker nodes by running the following on each as root:
  12. kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef \
  13.     --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
复制代码

4.2 配置kubectl

按照上面的输出提示,配置kubectl:
  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
复制代码

4.3 验证Master节点状态
  1. kubectl get nodes
复制代码

输出应该类似以下内容,Master节点的状态为NotReady,这是因为我们还没有安装网络插件:
  1. NAME         STATUS     ROLES    AGE   VERSION
  2. k8s-master   NotReady   master   2m    v1.22.0
复制代码

5. 工作节点加入

5.1 加入Worker节点

在每个Worker节点上,使用kubeadm init命令输出的kubeadm join命令加入集群:
  1. # 在Worker节点1上
  2. sudo kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef \
  3.     --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
  4. # 在Worker节点2上
  5. sudo kubeadm join 192.168.1.10:6443 --token abcdef.0123456789abcdef \
  6.     --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
复制代码

5.2 验证节点加入

在Master节点上,运行以下命令验证节点是否成功加入:
  1. kubectl get nodes
复制代码

输出应该类似以下内容,所有节点的状态都为NotReady,这是因为我们还没有安装网络插件:
  1. NAME         STATUS     ROLES    AGE   VERSION
  2. k8s-master   NotReady   master   5m    v1.22.0
  3. k8s-worker1  NotReady   <none>   1m    v1.22.0
  4. k8s-worker2  NotReady   <none>   1m    v1.22.0
复制代码

6. 网络插件安装

Kubernetes需要网络插件来管理Pod之间的网络。常用的网络插件有Calico、Flannel、Weave Net等。在本教程中,我们将使用Calico作为网络插件。

6.1 安装Calico

在Master节点上执行以下命令安装Calico:
  1. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码

6.2 验证网络插件安装

等待几分钟,然后检查节点状态:
  1. kubectl get nodes
复制代码

输出应该类似以下内容,所有节点的状态都为Ready:
  1. NAME         STATUS   ROLES    AGE   VERSION
  2. k8s-master   Ready    master   10m   v1.22.0
  3. k8s-worker1  Ready    <none>   6m    v1.22.0
  4. k8s-worker2  Ready    <none>   6m    v1.22.0
复制代码

检查Pod状态:
  1. kubectl get pods --all-namespaces
复制代码

输出应该显示所有系统Pod都处于Running状态。

7. 验证集群

7.1 检查集群信息
  1. kubectl cluster-info
复制代码

输出应该显示控制平面和核心服务的状态。

7.2 检查节点状态
  1. kubectl get nodes
复制代码

所有节点应该都处于Ready状态。

7.3 检查系统Pod
  1. kubectl get pods --all-namespaces
复制代码

所有系统Pod应该都处于Running状态。

8. 部署示例应用

为了验证集群功能,我们将部署一个简单的Nginx应用。

8.1 创建Nginx Deployment
  1. kubectl create deployment nginx --image=nginx
复制代码

8.2 扩展Deployment
  1. kubectl scale deployment nginx --replicas=3
复制代码

8.3 检查Pod状态
  1. kubectl get pods -o wide
复制代码

输出应该显示3个Nginx Pod分布在不同的节点上。

8.4 创建Service
  1. kubectl expose deployment nginx --port=80 --type=NodePort
复制代码

8.5 检查Service
  1. kubectl get svc nginx
复制代码

输出应该显示Service的详细信息,包括分配的NodePort。

8.6 测试访问

使用curl命令测试Nginx服务:
  1. NODE_PORT=$(kubectl get svc nginx -o jsonpath='{.spec.ports[0].nodePort}')
  2. NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
  3. curl http://$NODE_IP:$NODE_PORT
复制代码

应该看到Nginx的欢迎页面。

9. 高可用配置

在生产环境中,为了确保集群的高可用性,通常需要部署多个Master节点。以下是配置高可用Kubernetes集群的步骤:

9.1 负载均衡器设置

首先,需要设置一个负载均衡器来分发API Server的请求。可以使用硬件负载均衡器、软件负载均衡器(如HAProxy、Nginx)或云提供商的负载均衡器服务。

以下是一个使用HAProxy的示例配置:
  1. # 安装HAProxy
  2. sudo yum install -y haproxy
  3. # 配置HAProxy
  4. cat << EOF | sudo tee /etc/haproxy/haproxy.cfg
  5. frontend kubernetes-frontend
  6.     bind *:6443
  7.     mode tcp
  8.     option tcplog
  9.     default_backend kubernetes-backend
  10. backend kubernetes-backend
  11.     mode tcp
  12.     balance roundrobin
  13.     option tcp-check
  14.     server k8s-master1 192.168.1.10:6443 check
  15.     server k8s-master2 192.168.1.13:6443 check
  16.     server k8s-master3 192.168.1.14:6443 check
  17. EOF
  18. # 启动HAProxy
  19. sudo systemctl enable haproxy
  20. sudo systemctl start haproxy
复制代码

9.2 初始化第一个Master节点

在第一个Master节点上,使用负载均衡器的IP地址初始化集群:
  1. sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint "LOAD_BALANCER_IP:6443" --upload-certs
复制代码

这里的LOAD_BALANCER_IP是负载均衡器的IP地址。

9.3 加入其他Master节点

使用kubeadm init命令输出的kubeadm join命令加入其他Master节点:
  1. sudo kubeadm join LOAD_BALANCER_IP:6443 --token abcdef.0123456789abcdef \
  2.     --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
  3.     --control-plane --certificate-key CERTIFICATE_KEY
复制代码

9.4 加入Worker节点

使用普通的kubeadm join命令加入Worker节点:
  1. sudo kubeadm join LOAD_BALANCER_IP:6443 --token abcdef.0123456789abcdef \
  2.     --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
复制代码

9.5 安装网络插件

在第一个Master节点上安装网络插件,例如Calico:
  1. kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
复制代码

9.6 验证高可用集群

检查所有节点的状态:
  1. kubectl get nodes
复制代码

所有节点应该都处于Ready状态。

检查etcd集群的健康状态:
  1. kubectl get pods -n kube-system -l component=etcd
复制代码

所有etcd Pod应该都处于Running状态。

10. 监控与日志

10.1 安装Metrics Server

Metrics Server是Kubernetes的集群资源监控工具,可以收集节点和Pod的CPU和内存使用情况。
  1. kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
复制代码

验证Metrics Server是否正常运行:
  1. kubectl get pods -n kube-system -l k8s-app=metrics-server
复制代码

检查节点资源使用情况:
  1. kubectl top nodes
复制代码

10.2 安装Prometheus和Grafana

Prometheus是一个开源的监控和告警系统,Grafana是一个开源的度量分析和可视化套件。

首先,安装Helm:
  1. curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
  2. sudo apt-get install apt-transport-https --yes
  3. echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
  4. sudo apt-get update
  5. sudo apt-get install helm
复制代码

添加Prometheus Helm仓库:
  1. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  2. helm repo update
复制代码

安装Prometheus Operator:
  1. helm install prometheus prometheus-community/kube-prometheus-stack
复制代码

首先,获取Grafana的密码:
  1. kubectl get secret --namespace default prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
复制代码

然后,设置端口转发以访问Grafana:
  1. kubectl port-forward --namespace default svc/prometheus-grafana 3000:80
复制代码

现在,可以通过浏览器访问http://localhost:3000,使用用户名admin和上面获取的密码登录Grafana。

10.3 日志收集

EFK(Elasticsearch、Fluentd、Kibana)是一个流行的日志收集和分析解决方案。

首先,创建一个命名空间:
  1. kubectl create namespace logging
复制代码

然后,安装Elasticsearch:
  1. helm repo add elastic https://helm.elastic.co
  2. helm install elasticsearch elastic/elasticsearch --namespace logging
复制代码

安装Kibana:
  1. helm install kibana elastic/kibana --namespace logging
复制代码

安装Fluentd:
  1. helm repo add fluent https://fluent.github.io/helm-charts
  2. helm install fluent fluent/fluentd --namespace logging
复制代码

设置端口转发以访问Kibana:
  1. kubectl port-forward --namespace logging svc/kibana-kibana 5601:5601
复制代码

现在,可以通过浏览器访问http://localhost:5601使用Kibana。

11. 备份与恢复

11.1 备份etcd

etcd是Kubernetes的关键组件,存储了集群的所有状态信息。备份etcd是备份Kubernetes集群的关键步骤。

首先,获取etcd Pod的名称:
  1. kubectl get pods -n kube-system -l component=etcd
复制代码

然后,使用etcdctl工具创建快照:
  1. kubectl exec -it -n kube-system ETCD_POD_NAME -- sh -c "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 /var/lib/etcd/snapshot.db"
复制代码

将快照复制到本地:
  1. kubectl cp -n kube-system ETCD_POD_NAME:/var/lib/etcd/snapshot.db ./snapshot.db
复制代码

Velero是一个Kubernetes备份和恢复工具,可以备份整个集群,包括持久卷。

安装Velero:
  1. helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
  2. helm install velero vmware-tanzu/velero
复制代码

创建备份:
  1. velero backup create my-backup --include-namespaces=default
复制代码

列出备份:
  1. velero backup get
复制代码

11.2 恢复etcd

首先,将快照复制到etcd Pod:
  1. kubectl cp ./snapshot.db -n kube-system ETCD_POD_NAME:/var/lib/etcd/snapshot.db
复制代码

然后,使用etcdctl工具恢复快照:
  1. kubectl exec -it -n kube-system ETCD_POD_NAME -- sh -c "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 /var/lib/etcd/snapshot.db"
复制代码

重启etcd Pod:
  1. kubectl delete pod -n kube-system ETCD_POD_NAME
复制代码

使用Velero恢复备份:
  1. velero restore create --from-backup my-backup
复制代码

检查恢复状态:
  1. velero restore get
复制代码

12. 安全最佳实践

12.1 RBAC配置

基于角色的访问控制(RBAC)是Kubernetes的安全机制,用于管理用户和服务账户的权限。
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: Role
  3. metadata:
  4.   namespace: default
  5.   name: pod-reader
  6. rules:
  7. - apiGroups: [""]
  8.   resources: ["pods"]
  9.   verbs: ["get", "watch", "list"]
复制代码

应用角色:
  1. kubectl apply -f role.yaml
复制代码
  1. apiVersion: rbac.authorization.k8s.io/v1
  2. kind: RoleBinding
  3. metadata:
  4.   name: read-pods
  5.   namespace: default
  6. subjects:
  7. - kind: User
  8.   name: jane
  9.   apiGroup: rbac.authorization.k8s.io
  10. roleRef:
  11.   kind: Role
  12.   name: pod-reader
  13.   apiGroup: rbac.authorization.k8s.io
复制代码

应用角色绑定:
  1. kubectl apply -f rolebinding.yaml
复制代码

12.2 网络策略

网络策略用于控制Pod之间的网络流量。
  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4.   name: test-network-policy
  5.   namespace: default
  6. spec:
  7.   podSelector:
  8.     matchLabels:
  9.       role: db
  10.   policyTypes:
  11.   - Ingress
  12.   - Egress
  13.   ingress:
  14.   - from:
  15.     - ipBlock:
  16.         cidr: 172.17.0.0/16
  17.         except:
  18.         - 172.17.1.0/24
  19.     - namespaceSelector:
  20.         matchLabels:
  21.           project: myproject
  22.     - podSelector:
  23.         matchLabels:
  24.           role: frontend
  25.     ports:
  26.     - protocol: TCP
  27.       port: 6379
  28.   egress:
  29.   - to:
  30.     - ipBlock:
  31.         cidr: 10.0.0.0/24
  32.     ports:
  33.     - protocol: TCP
  34.       port: 5978
复制代码

应用网络策略:
  1. kubectl apply -f networkpolicy.yaml
复制代码

12.3 Pod安全策略

Pod安全策略用于控制Pod的安全设置。
  1. apiVersion: policy/v1beta1
  2. kind: PodSecurityPolicy
  3. metadata:
  4.   name: restricted
  5. spec:
  6.   privileged: false
  7.   allowPrivilegeEscalation: false
  8.   requiredDropCapabilities:
  9.     - ALL
  10.   volumes:
  11.     - 'configMap'
  12.     - 'emptyDir'
  13.     - 'projected'
  14.     - 'secret'
  15.     - 'downwardAPI'
  16.     - 'persistentVolumeClaim'
  17.   runAsUser:
  18.     rule: 'MustRunAsNonRoot'
  19.   seLinux:
  20.     rule: 'RunAsAny'
  21.   fsGroup:
  22.     rule: 'RunAsAny'
复制代码

应用Pod安全策略:
  1. kubectl apply -f psp.yaml
复制代码

12.4 使用TLS保护API Server

确保API Server使用TLS加密通信:
  1. kubectl get secrets -n kube-system | grep tls
复制代码

检查证书的有效期:
  1. kubectl get secrets -n kube-system -o jsonpath='{.items[*].data.ca\.crt}' | base64 -d | openssl x509 -noout -dates
复制代码

12.5 使用Secret管理敏感信息

使用Kubernetes Secret来管理敏感信息,如密码、API密钥等。
  1. kubectl create secret generic db-password --from-literal=password='mysecretpassword'
复制代码
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: mypod
  5. spec:
  6.   containers:
  7.   - name: mypod
  8.     image: redis
  9.     env:
  10.       - name: PASSWORD
  11.         valueFrom:
  12.           secretKeyRef:
  13.             name: db-password
  14.             key: password
复制代码

应用Pod定义:
  1. kubectl apply -f pod-with-secret.yaml
复制代码

13. 性能优化

13.1 节点资源优化

编辑/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,添加以下参数:
  1. Environment="KUBELET_EXTRA_ARGS=--max-pods=100 --eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<1Gi"
复制代码

重启kubelet:
  1. sudo systemctl daemon-reload
  2. sudo systemctl restart kubelet
复制代码

编辑/etc/sysctl.d/k8s.conf文件,添加以下参数:
  1. net.core.somaxconn = 65535
  2. net.ipv4.tcp_max_syn_backlog = 65535
  3. net.core.netdev_max_backlog = 65535
复制代码

应用参数:
  1. sudo sysctl --system
复制代码

13.2 Pod资源优化
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: mypod
  5. spec:
  6.   containers:
  7.   - name: mycontainer
  8.     image: nginx
  9.     resources:
  10.       requests:
  11.         memory: "64Mi"
  12.         cpu: "250m"
  13.       limits:
  14.         memory: "128Mi"
  15.         cpu: "500m"
复制代码

应用Pod定义:
  1. kubectl apply -f pod-with-resources.yaml
复制代码
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myapp
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: myapp
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: myapp
  14.     spec:
  15.       affinity:
  16.         podAntiAffinity:
  17.           requiredDuringSchedulingIgnoredDuringExecution:
  18.           - labelSelector:
  19.               matchExpressions:
  20.               - key: app
  21.                 operator: In
  22.                 values:
  23.                 - myapp
  24.             topologyKey: "kubernetes.io/hostname"
  25.       containers:
  26.       - name: myapp
  27.         image: nginx
复制代码

应用Deployment定义:
  1. kubectl apply -f deployment-with-affinity.yaml
复制代码

13.3 网络优化

以Calico为例,可以通过修改ConfigMap来调整网络参数:
  1. kubectl edit configmap calico-config -n kube-system
复制代码

在ConfigMap中添加或修改以下参数:
  1. "mtu": 1440,
  2. "container_interface": " cali*",
  3. "ipip": {
  4.     "enabled": true,
  5.     "mode": "Always"
  6. }
复制代码

对于需要频繁访问外部服务的应用,可以使用本地缓存来减少网络请求:
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: myapp
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: myapp
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: myapp
  14.     spec:
  15.       containers:
  16.       - name: myapp
  17.         image: myapp
  18.         env:
  19.         - name: CACHE_SIZE
  20.           value: "1000"
  21.         - name: CACHE_TTL
  22.           value: "60"
  23.         resources:
  24.           requests:
  25.             memory: "256Mi"
  26.             cpu: "250m"
  27.           limits:
  28.             memory: "512Mi"
  29.             cpu: "500m"
  30.         volumeMounts:
  31.         - name: cache-volume
  32.           mountPath: /cache
  33.       volumes:
  34.       - name: cache-volume
  35.         emptyDir:
  36.           sizeLimit: 1Gi
复制代码

应用Deployment定义:
  1. kubectl apply -f deployment-with-cache.yaml
复制代码

14. 常见问题与解决方案

14.1 节点NotReady问题

节点长时间处于NotReady状态。

1. 检查kubelet服务状态:
  1. sudo systemctl status kubelet
复制代码

如果kubelet未运行,启动它:
  1. sudo systemctl start kubelet
  2. sudo systemctl enable kubelet
复制代码

1. 检查kubelet日志:
  1. sudo journalctl -u kubelet
复制代码

1. 检查节点上的网络插件状态:
  1. kubectl get pods --all-namespaces -o wide | grep $(hostname)
复制代码

1. 检查节点上的CNI配置:
  1. ls /etc/cni/net.d/
复制代码

14.2 Pod处于Pending状态

Pod长时间处于Pending状态。

1. 检查Pod事件:
  1. kubectl describe pod POD_NAME
复制代码

1. 检查集群资源使用情况:
  1. kubectl top nodes
复制代码

1. 如果是资源不足问题,考虑添加更多节点或调整Pod的资源请求。
2. 如果是调度问题,检查节点标签和污点:

如果是资源不足问题,考虑添加更多节点或调整Pod的资源请求。

如果是调度问题,检查节点标签和污点:
  1. kubectl get nodes --show-labels
  2. kubectl describe nodes | grep Taints
复制代码

14.3 Pod处于CrashLoopBackOff状态

Pod反复崩溃并重启。

1. 检查Pod日志:
  1. kubectl logs POD_NAME
复制代码

如果容器已经崩溃,使用前面的容器日志:
  1. kubectl logs POD_NAME --previous
复制代码

1. 检查Pod事件:
  1. kubectl describe pod POD_NAME
复制代码

1. 检查Pod定义,特别是资源限制和探针配置:
  1. kubectl get pod POD_NAME -o yaml
复制代码

1. 如果是应用程序问题,考虑在本地调试应用程序。

14.4 镜像拉取失败

Pod无法拉取镜像。

1. 检查镜像名称和标签是否正确:
  1. kubectl get pod POD_NAME -o yaml | grep image:
复制代码

1. 检查镜像仓库是否可访问:
  1. curl -I https://registry-1.docker.io/v2/
复制代码

1. 如果使用私有仓库,确保已正确配置imagePullSecrets:
  1. kubectl get secret
复制代码

1. 如果是网络问题,检查节点上的网络配置和代理设置。

14.5 Service无法访问

创建Service后无法访问。

1. 检查Service定义:
  1. kubectl get svc SVC_NAME -o yaml
复制代码

1. 检查Service的端点:
  1. kubectl get endpoints SVC_NAME
复制代码

如果端点为空,检查Pod标签是否与Service选择器匹配:
  1. kubectl get pods --show-labels
复制代码

1. 检查网络插件是否正常工作:
  1. kubectl get pods --all-namespaces -o wide | grep kube-system | grep -E "(calico|flannel|weave)"
复制代码

1. 检查kube-proxy是否正常工作:
  1. kubectl get pods --all-namespaces -o wide | grep kube-proxy
复制代码

1. 如果是ClusterIP Service,尝试从Pod内部访问:
  1. kubectl run busybox -it --image=busybox --rm -- sh
  2. wget -qO- http://SVC_IP:SVC_PORT
复制代码

1. 如果是NodePort Service,检查节点防火墙是否允许NodePort端口:
  1. sudo iptables -L -n | grep NODE_PORT
复制代码

15. 总结与展望

本指南详细介绍了在AlmaLinux系统上部署Kubernetes集群的完整过程,从环境准备到集群部署,再到最佳实践。通过遵循本指南,您可以轻松搭建企业级容器平台,为您的应用程序提供强大的容器编排能力。

随着云原生技术的不断发展,Kubernetes生态系统也在不断演进。未来,我们可以期待更多创新和改进,如:

• 更强大的安全功能和工具
• 更简化的集群管理和运维
• 更好的多集群和混合云支持
• 更高效的资源利用和性能优化
• 更广泛的应用场景和解决方案

无论您是刚刚开始使用Kubernetes,还是已经有一定经验,希望本指南都能为您提供有价值的参考和帮助。祝您在Kubernetes的旅程中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则