k8s实战指南
·
Kubernetes (k8s) 实战指南
Kubernetes 是当前最流行的容器编排平台,广泛应用于生产环境。以下从集群部署、应用管理、监控调试等方面提供实战指导。
集群部署
使用 kubeadm 快速部署生产级集群。准备至少 2 台 Linux 机器(1 master + 1 worker),确保系统满足以下要求:
- 2GB 以上内存
- 2核以上CPU
- 禁用 swap 分区
- 唯一主机名和MAC地址
在所有节点安装 docker 和 kubeadm:
# 安装docker
apt-get update && apt-get install -y docker.io
# 安装kubeadm
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt-get update && apt-get install -y kubelet kubeadm kubectl
在 master 节点初始化集群:
kubeadm init --pod-network-cidr=10.244.0.0/16
在 worker 节点加入集群(使用 init 命令输出的 join 指令):
kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
安装网络插件(以 flannel 为例):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
应用部署
通过 Deployment 管理 Pod 副本。创建 nginx 部署示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
使用 Service 暴露应用。创建 ClusterIP 和 NodePort 服务:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
存储管理
使用 PersistentVolume 和 PersistentVolumeClaim 管理持久化存储。创建本地存储示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-local
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /mnt/data
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
创建对应的 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-local
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: local-storage
监控与日志
使用 Prometheus 和 Grafana 搭建监控系统。通过 Helm 快速安装:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
查看 Pod 日志:
kubectl logs <pod-name> -n <namespace>
实时查看多个容器日志:
kubectl logs -f <pod-name> -c <container-name> --tail=100
故障排查
常见问题诊断命令:
- 查看 Pod 详细状态:
kubectl describe pod <pod-name>
- 检查集群事件:
kubectl get events --sort-by=.metadata.creationTimestamp
- 进入容器调试:
kubectl exec -it <pod-name> -- /bin/sh
- 检查网络连通性:
kubectl run busybox --image=busybox --rm -it --restart=Never -- ping <service-name>
安全实践
实施最小权限原则。创建 ServiceAccount 和 Role:
apiVersion: v1
kind: ServiceAccount
metadata:
name: limited-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
subjects:
- kind: ServiceAccount
name: limited-user
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
启用网络策略控制 Pod 间通信:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
自动伸缩
配置 HPA 实现自动扩缩容:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
查看 HPA 状态:
kubectl get hpa
CI/CD 集成
在 Jenkins 中配置 Kubernetes 插件,使用如下 Pipeline 示例:
pipeline {
agent {
kubernetes {
label 'jenkins-agent'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: jenkins/inbound-agent:4.3-4
- name: docker
image: docker:19.03
command: ['cat']
tty: true
- name: kubectl
image: bitnami/kubectl:1.17
command: ['cat']
tty: true
"""
}
}
stages {
stage('Build') {
steps {
container('docker') {
sh 'docker build -t my-app .'
}
}
}
stage('Deploy') {
steps {
container('kubectl') {
sh 'kubectl apply -f k8s-manifests/'
}
}
}
}
}
更多推荐
所有评论(0)