Kubernetes 深入讲解
目录
- 概述
- Kubernetes 基本概念
- 2.1 Kubernetes 简介
- 2.2 Kubernetes 架构
- 2.3 Kubernetes 主要组件
- Kubernetes 安装与配置
- 3.1 安装 Kubernetes
- 3.2 配置 Kubernetes
- 3.3 验证 Kubernetes 安装
- Kubernetes 资源对象
- 4.1 Pod
- 4.2 ReplicaSet
- 4.3 Deployment
- 4.4 Service
- 4.5 ConfigMap 和 Secret
- 4.6 Volume
- Kubernetes 高级特性
- 5.1 命名空间(Namespace)
- 5.2 水平自动伸缩(Horizontal Pod Autoscaler)
- 5.3 负载均衡和服务发现
- 5.4 滚动更新和回滚
- Kubernetes 网络
- 6.1 网络模型
- 6.2 CNI 插件
- 6.3 服务网格(Service Mesh)
- Kubernetes 存储
- 7.1 持久化存储(Persistent Volumes)
- 7.2 存储类(Storage Classes)
- 7.3 动态存储供应
- Kubernetes 安全
- 8.1 认证和授权
- 8.2 网络策略
- 8.3 Pod 安全策略
- Kubernetes 运维
- 9.1 日志和监控
- 9.2 备份和恢复
- 9.3 故障排除
- Kubernetes 扩展
- 10.1 自定义资源(Custom Resource)
- 10.2 操作器模式(Operator Pattern)
- 10.3 Kubernetes 插件和扩展
- 案例分析
- 11.1 微服务架构的应用
- 11.2 大数据处理的应用
- 11.3 混合云和多云架构的应用
- 总结
1. 概述
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。Kubernetes起源于谷歌的Borg系统,由谷歌在2014年开源,目前已成为云原生计算基金会(CNCF)的旗舰项目。本文将深入讲解Kubernetes的基本概念、安装配置、资源对象、高级特性、网络、存储、安全、运维、扩展及实际案例分析。
2. Kubernetes 基本概念
2.1 Kubernetes 简介
Kubernetes是一个用于管理容器化应用的开源平台。它提供了一个容器编排引擎,能够自动化容器的部署、扩展和管理。
2.2 Kubernetes 架构
Kubernetes采用主从架构,包括一个主节点(Master Node)和多个工作节点(Worker Nodes)。主节点负责管理集群的控制平面,工作节点运行应用容器。
2.3 Kubernetes 主要组件
主节点组件
- API Server:提供Kubernetes API,负责接收、验证和处理API请求。
- etcd:分布式键值存储,保存集群状态和配置信息。
- Controller Manager:负责执行集群的控制逻辑,如副本控制器、节点控制器等。
- Scheduler:负责调度Pod到合适的工作节点上运行。
工作节点组件
- Kubelet:负责管理节点上的容器,确保容器按照Pod定义运行。
- Kube-proxy:负责实现Kubernetes服务的网络代理和负载均衡。
- Container Runtime:负责运行和管理容器,如Docker、containerd等。
3. Kubernetes 安装与配置
3.1 安装 Kubernetes
Kubernetes可以通过多种方式安装,如kubeadm、minikube、kops等。这里以kubeadm为例,介绍Kubernetes的安装步骤。
1. 准备工作
在所有节点上安装Docker和kubeadm。
# 安装Docker
sudo apt-get update
sudo apt-get install -y docker.io
# 安装kubeadm、kubelet和kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2. 初始化主节点
在主节点上初始化Kubernetes集群。
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
初始化完成后,按照提示配置kubectl。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 部署网络插件
部署网络插件以实现Pod之间的通信。这里以Calico为例。
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
4. 加入工作节点
在工作节点上运行以下命令,将其加入Kubernetes集群。
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
3.2 配置 Kubernetes
Kubernetes的配置主要通过kubeadm
和kubectl
命令进行。
配置kubectl
配置kubectl以管理Kubernetes集群。
kubectl config set-cluster <cluster-name> --server=<api-server>
kubectl config set-credentials <user> --token=<token>
kubectl config set-context <context-name> --cluster=<cluster-name> --user=<user>
kubectl config use-context <context-name>
3.3 验证 Kubernetes 安装
通过以下命令验证Kubernetes集群是否正常运行。
kubectl get nodes
kubectl get pods --all-namespaces
4. Kubernetes 资源对象
4.1 Pod
Pod是Kubernetes中最小的部署单元,包含一个或多个容器。Pod共享存储和网络资源。
示例代码:创建一个简单的Pod
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f my-pod.yaml
kubectl get pods
4.2 ReplicaSet
ReplicaSet确保指定数量的Pod副本在集群中运行。
示例代码:创建一个ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f my-replicaset.yaml
kubectl get replicasets
4.3 Deployment
Deployment管理Pod和ReplicaSet,提供声明式更新、回滚和扩展等功能。
示例代码:创建一个Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
kubectl apply -f my
-deployment.yaml
kubectl get deployments
4.4 Service
Service定义了一组Pod的访问策略,提供负载均衡和服务发现功能。
示例代码:创建一个Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f my-service.yaml
kubectl get services
4.5 ConfigMap 和 Secret
ConfigMap和Secret用于管理配置数据和敏感信息。
示例代码:创建一个ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
key1: value1
key2: value2
kubectl apply -f my-config.yaml
kubectl get configmaps
示例代码:创建一个Secret
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kubectl apply -f my-secret.yaml
kubectl get secrets
4.6 Volume
Volume用于持久化和共享数据,支持多种存储后端。
示例代码:创建一个Pod并挂载Volume
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: my-volume
volumes:
- name: my-volume
emptyDir: {}
kubectl apply -f my-pod-volume.yaml
kubectl get pods
5. Kubernetes 高级特性
5.1 命名空间(Namespace)
Namespace用于将集群资源分隔开,支持多租户环境。
示例代码:创建一个Namespace
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
kubectl apply -f my-namespace.yaml
kubectl get namespaces
5.2 水平自动伸缩(Horizontal Pod Autoscaler)
水平自动伸缩根据CPU、内存等指标自动调整Pod副本数量。
示例代码:创建一个水平自动伸缩
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 80
kubectl apply -f my-hpa.yaml
kubectl get hpa
5.3 负载均衡和服务发现
Kubernetes提供内置的负载均衡和服务发现功能,通过Service实现。
示例代码:创建一个带有负载均衡的Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f my-loadbalancer-service.yaml
kubectl get services
5.4 滚动更新和回滚
Deployment支持滚动更新和回滚,确保应用的高可用性。
示例代码:滚动更新Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19.0
ports:
- containerPort: 80
kubectl apply -f my-deployment.yaml
kubectl rollout status deployment/my-deployment
示例代码:回滚Deployment
kubectl rollout undo deployment/my-deployment
kubectl rollout status deployment/my-deployment
6. Kubernetes 网络
6.1 网络模型
Kubernetes使用扁平网络模型,所有Pod都可以直接通信。每个Pod都有一个唯一的IP地址,Service通过ClusterIP提供负载均衡和服务发现。
6.2 CNI 插件
Kubernetes支持多种CNI插件,如Flannel、Calico、Weave等,提供网络功能。
示例代码:安装Calico网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get pods -n kube-system
6.3 服务网格(Service Mesh)
服务网格通过在每个服务实例旁边部署代理,实现服务间通信的管理、监控和安全。Istio是一个流行的服务网格实现。
示例代码:安装Istio
curl -L https://istio.io/downloadIstio | sh -
cd istio-<version>
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y
kubectl label namespace default istio-injection=enabled
kubectl get pods -n istio-system
7. Kubernetes 存储
7.1 持久化存储(Persistent Volumes)
Persistent Volumes(PV)提供独立于Pod生命周期的持久化存储,Persistent Volume Claims(PVC)用于请求PV。
示例代码:创建Persistent Volume和Persistent Volume Claim
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kubectl apply -f my-pv-pvc.yaml
kubectl get pv
kubectl get pvc
7.2 存储类(Storage Classes)
Storage Classes定义存储的类型和参数,用于动态供应PV。
示例代码:创建存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-storage-class
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
zone: us-west-2a
kubectl apply -f my-storage-class.yaml
kubectl get storageclass
7.3 动态存储供应
动态存储供应根据PVC请求自动创建PV。
示例代码:动态供应PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-dynamic-pvc
spec:
storageClassName: my-storage-class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kubectl apply -f my-dynamic-pvc.yaml
kubectl get pvc
kubectl get pv
8. Kubernetes 安全
8.1 认证和授权
Kubernetes通过认证和授权控制集群的访问。认证方式包括证书、用户名/密码、令牌等,授权通过RBAC(基于角色的访问控制)实现。
示例代码:创建RBAC规则
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: "jane"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
kubectl apply -f my-rbac.yaml
kubectl get roles
kubectl get rolebindings
8.2 网络策略
网络策略用于控制Pod之间和Pod与外部的网络通信。
示例代码:创建网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: my-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 3306
kubectl apply -f my-network
-policy.yaml
kubectl get networkpolicies
8.3 Pod 安全策略
Pod安全策略控制Pod的安全设置,如运行用户、特权权限、卷类型等。
示例代码:创建Pod安全策略
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: my-psp
spec:
privileged: false
seLinux:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
runAsUser:
rule: MustRunAsNonRoot
fsGroup:
rule: RunAsAny
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
kubectl apply -f my-psp.yaml
kubectl get psp
9. Kubernetes 运维
9.1 日志和监控
日志和监控是保障Kubernetes集群稳定运行的重要手段。常见的日志和监控工具包括ELK(Elasticsearch、Logstash、Kibana)、Prometheus、Grafana等。
示例代码:使用Prometheus监控Kubernetes
kubectl apply -f https://github.com/prometheus-operator/prometheus-operator/blob/master/bundle.yaml
kubectl get pods -n monitoring
9.2 备份和恢复
备份和恢复是保障Kubernetes集群数据安全的重要措施。常见的备份和恢复工具包括Velero、Kasten等。
示例代码:使用Velero备份和恢复Kubernetes
velero install --provider aws --bucket <bucket> --secret-file <credentials-velero> --backup-location-config region=<region>
velero backup create my-backup
velero restore create --from-backup my-backup
9.3 故障排除
故障排除是Kubernetes运维的重要环节,常见的故障排除方法包括日志分析、事件检查、Pod状态检查等。
示例代码:查看Pod事件
kubectl describe pod <pod-name>
kubectl logs <pod-name>
kubectl get events
10. Kubernetes 扩展
10.1 自定义资源(Custom Resource)
自定义资源允许用户定义和管理新的Kubernetes API对象。常见的自定义资源包括CRD(Custom Resource Definition)和Operator。
示例代码:创建CRD
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: myresources.mygroup.example.com
spec:
group: mygroup.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: myresources
singular: myresource
kind: MyResource
kubectl apply -f my-crd.yaml
kubectl get crd
10.2 操作器模式(Operator Pattern)
操作器模式通过扩展Kubernetes API,实现应用的自动化运维。Operator是基于CRD和控制器实现的。
示例代码:使用Operator SDK创建Operator
operator-sdk init --domain=example.com --repo=github.com/example/my-operator
operator-sdk create api --group=mygroup --version=v1 --kind=MyResource --resource --controller
make install
make run
10.3 Kubernetes 插件和扩展
Kubernetes支持多种插件和扩展,如Dashboard、Metrics Server、Helm等,提供增强的功能和管理能力。
示例代码:安装Kubernetes Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
kubectl proxy
11. 案例分析
11.1 微服务架构的应用
在微服务架构中,Kubernetes可以实现服务的自动化部署、扩展和管理,提升系统的灵活性和可维护性。
示例代码:使用Kubernetes部署微服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend
image: my-frontend
---
apiVersion: v1
kind: Service
metadata:
name: frontend
spec:
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 80
kubectl apply -f my-frontend.yaml
kubectl get deployments
kubectl get services
11.2 大数据处理的应用
在大数据处理中,Kubernetes可以实现计算资源的动态调度和管理,提高资源利用率和计算效率。
示例代码:使用Kubernetes部署Spark集群
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: spark-master
spec:
serviceName: "spark"
replicas: 1
selector:
matchLabels:
app: spark
role: master
template:
metadata:
labels:
app: spark
role: master
spec:
containers:
- name: spark-master
image: bitnami/spark
env:
- name: SPARK_MODE
value: "master"
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: spark-worker
spec:
serviceName: "spark"
replicas: 3
selector:
matchLabels:
app: spark
role: worker
template:
metadata:
labels:
app: spark
role: worker
spec:
containers:
- name: spark-worker
image: bitnami/spark
env:
- name: SPARK_MODE
value: "worker"
- name: SPARK_MASTER_URL
value: "spark://spark-master:7077"
kubectl apply -f spark-master.yaml
kubectl apply -f spark-worker.yaml
kubectl get statefulsets
11.3 混合云和多云架构的应用
在混合云和多云架构中,Kubernetes可以实现跨云的统一管理和调度,提升系统的灵活性和可靠性。
示例代码:使用KubeFed实现跨云管理
kubectl create ns kube-federation-system
kubectl config use-context <context-name>
kubefedctl join <cluster-name> --host-cluster-context=<host-context> --add-to-registry
12. 总结
Kubernetes作为现代应用的基础架构平台,提供了丰富的功能和强大的管理能力。通过深入了解Kubernetes的基本概念、安装配置、资源对象、高级特性、网络、存储、安全、运维、扩展及实际案例应用,可以更好地利用Kubernetes实现应用的自动化部署、扩展和管理。