# 使用kubeadm初始化主节点
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16
# 添加工作节点
kubeadm join LOAD_BALANCER_DNS:LOAD_BALANCER_PORT --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
# deployment.yaml 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 5
# service.yaml 示例
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
多节点部署:确保应用副本分布在不同的物理节点上
kubectl get pods -o wide
自动扩缩容:
kubectl autoscale deployment myapp-deployment --min=3 --max=10 --cpu-percent=80
节点亲和性/反亲和性:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
持久化存储:
volumes:
- name: data
persistentVolumeClaim:
claimName: myapp-pvc
安装Prometheus Operator:
helm install prometheus stable/prometheus-operator
设置告警规则:
groups:
- name: example
rules:
- alert: HighPodMemory
expr: sum(container_memory_usage_bytes{container_name!="POD"}) by (pod_name) / 1024 / 1024 > 100
for: 5m
labels:
severity: warning
annotations:
summary: High memory usage in pod {{ $labels.pod_name }}
日志收集(EFK):
kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch.yaml
定期备份:
# 备份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 snapshot.db
跨区域部署:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
蓝绿部署/金丝雀发布:
kubectl apply -f new-deployment.yaml
kubectl rollout status deployment/myapp-deployment
kubectl set image deployment/myapp-deployment myapp=myapp:v2
网络策略:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
RBAC配置:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
镜像扫描:
# 使用Trivy扫描镜像
trivy image myapp:latest
通过以上方案,您可以在Linux上构建一个高可用的容器化应用环境,确保应用在节点故障、网络问题等情况下仍能保持服务可用性。