Kubernetes 高级应用讲解
目录
- 概述
- Kubernetes 高级网络
- 2.1 网络策略(Network Policies)
- 2.2 服务网格(Service Mesh)
- 2.3 Ingress 控制器
- Kubernetes 存储高级用法
- 3.1 动态存储供应
- 3.2 存储类(Storage Classes)
- 3.3 CSI 插件
- Kubernetes 安全
- 4.1 RBAC 权限管理
- 4.2 Pod 安全策略
- 4.3 网络策略
- Kubernetes 自动化运维
- 5.1 自动扩展
- 5.2 滚动更新和回滚
- 5.3 CI/CD 集成
- Kubernetes 多租户
- 6.1 命名空间隔离
- 6.2 资源配额
- 6.3 网络隔离
- Kubernetes 的监控和日志
- 7.1 Prometheus 和 Grafana
- 7.2 EFK 堆栈
- 7.3 分布式追踪
- Kubernetes 的扩展
- 8.1 自定义控制器
- 8.2 Operator 模式
- 8.3 Webhook
- Kubernetes 高可用性
- 9.1 主节点高可用
- 9.2 ETCD 集群
- 9.3 跨区域集群
- 案例分析
- 10.1 高可用Web应用
- 10.2 分布式数据库
- 10.3 数据分析平台
- 总结
1. 概述
Kubernetes(K8s)作为一款开源的容器编排平台,提供了丰富的功能和灵活的管理能力,能够支持企业级应用的自动化部署、扩展和管理。本文将深入探讨Kubernetes的高级应用,包括高级网络、存储、安全、自动化运维、多租户、监控和日志、扩展以及高可用性等方面。
2. Kubernetes 高级网络
2.1 网络策略(Network Policies)
网络策略用于控制Pod之间以及Pod与外部之间的网络流量。它基于标签选择器定义流量规则,提供了更细粒度的网络安全控制。
示例代码:创建网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector:
matchLabels:
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: myapp
2.2 服务网格(Service Mesh)
服务网格通过在每个服务实例旁边部署代理,管理服务间的通信、监控和安全。Istio和Linkerd是常见的服务网格实现。
示例代码:安装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
2.3 Ingress 控制器
Ingress控制器管理外部访问Kubernetes服务的路由规则,提供HTTP和HTTPS路由。
示例代码:创建Ingress资源
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
3. Kubernetes 存储高级用法
3.1 动态存储供应
动态存储供应通过StorageClass根据PVC请求自动创建PV,简化了存储管理。
示例代码:创建StorageClass和PVC
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: my-storage-class
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
zone: us-west-2a
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-dynamic-pvc
spec:
storageClassName: my-storage-class
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
3.2 存储类(Storage Classes)
Storage Classes定义不同类型的存储并指定参数,支持动态存储供应。
示例代码:创建StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: high-io-storage-class
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-ssd
replication-type: none
3.3 CSI 插件
容器存储接口(CSI)插件为Kubernetes提供统一的存储插件架构,支持多种存储后端。
示例代码:安装CSI插件
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-attacher/master/deploy/kubernetes/rbac-csi-attacher.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-provisioner/master/deploy/kubernetes/rbac-csi-provisioner.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/master/deploy/kubernetes/rbac-csi-snapshotter.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/node-driver-registrar/master/deploy/kubernetes/rbac-csi-node-driver-registrar.yaml
4. Kubernetes 安全
4.1 RBAC 权限管理
RBAC(基于角色的访问控制)用于管理用户和应用的权限,控制其对Kubernetes资源的访问。
示例代码:创建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
4.2 Pod 安全策略
Pod安全策略(PSP)控制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'
4.3 网络策略
网络策略用于控制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
5. Kubernetes 自动化运维
5.1 自动扩展
自动扩展根据资源使用情况自动调整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
5.2 滚动更新和回滚
滚动更新和回滚确保应用在更新过程中的高可用性。
示例代码:滚动更新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
5.3 CI/CD 集成
Kubernetes与CI/CD工具集成,实现自动化构建、测试和部署。
示例代码:使用GitLab CI进行构建和部署
stages:
- build
- deploy
build:
stage: build
script:
- docker build -t my-image .
- docker push my-image
deploy:
stage: deploy
script:
- kubectl apply -f deployment.yaml
6. Kubernetes 多租户
6.1 命名空间隔离
命名空间用于隔离不同租户的资源,支持多租户环境。
示例代码:创建命名空间
apiVersion: v1
kind: Namespace
metadata:
name: tenant1
kubectl apply -f tenant1-namespace.yaml
kubectl get namespaces
6.2 资源配额
资源配额控制命名空间的资源使用量,防止资源滥用。
示例代码:创建资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: tenant1-quota
namespace: tenant1
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: "16Gi"
limits.cpu: "8"
limits.memory: "32Gi"
kubectl apply -f tenant1-quota.yaml
kubectl get resourcequotas -n tenant1
6.3 网络隔离
网络策略用于隔离不同租户之间的网络流量,确保多租户环境的安全。
示例代码:创建网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: tenant1-network-policy
namespace: tenant1
spec:
podSelector:
matchLabels:
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
tenant: tenant1
7. Kubernetes 的监控和日志
7.1 Prometheus 和 Grafana
Prometheus和Grafana用于监控Kubernetes集群和应用。
示例代码:安装Prometheus和Grafana
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/master/bundle.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/grafana-deployment.yaml
7.2 EFK 堆栈
EFK(Elasticsearch、Fluentd、Kibana)用于集中式日志管理和分析。
示例代码:安装EFK堆栈
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/fluentd-es-ds.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-controller.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/es-service.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/kibana-deployment.yaml
7.3 分布式追踪
分布式追踪用于跟踪和分析分布式系统中的请求,常见工具包括Jaeger和Zipkin。
示例代码:安装Jaeger
kubectl create namespace observability
kubectl apply -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/crds/jaegertracing.io_jaegers_crd.yaml
kubectl apply -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/service_account.yaml
kubectl apply -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role.yaml
kubectl apply -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role_binding.yaml
kubectl apply -n observability -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/operator.yaml
8. Kubernetes 的扩展
8.1 自定义控制器
自定义控制器用于管理自定义资源,实现复杂的业务逻辑。
示例代码:创建自定义控制器
package main
import (
"context"
"log"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/reconcile"
)
type MyReconciler struct {
client.Client
}
func (r *MyReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
// 业务逻辑
return reconcile.Result{}, nil
}
func main() {
mgr, err := manager.New(manager.GetConfigOrDie(), manager.Options{})
if err != nil {
log.Fatal(err)
}
if err := mgr.Add(&MyReconciler{Client: mgr.GetClient()}); err != nil {
log.Fatal(err)
}
if err := mgr.Start(signals.SetupSignalHandler()); err != nil {
log.Fatal(err)
}
}
8.2 Operator 模式
Operator模式通过扩展Kubernetes API,实现应用的自动化运维。
示例代码:使用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
8.3 Webhook
Webhook用于扩展Kubernetes的行为,实现自定义的验证和变更。
示例代码:创建Webhook配置
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: my-webhook
webhooks:
- name: webhook.example.com
clientConfig:
service:
name: my-webhook-service
namespace: default
path: "/mutate"
caBundle: <ca-bundle>
rules:
- operations: ["CREATE"]
apiGroups: [""]
apiVersions: ["v1"]
resources: ["pods"]
admissionReviewVersions: ["v1"]
sideEffects: None
9. Kubernetes 高可用性
9.1 主节点高可用
主节点高可用通过部署多个主节点,实现集群的冗余和容错。
示例代码:部署高可用主节点
kubeadm init --control-plane-endpoint "<LOAD_BALANCER_DNS>:6443" --upload-certs
kubeadm join <LOAD_BALANCER_DNS>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --control-plane --certificate-key <CERT_KEY>
9.2 ETCD 集群
ETCD集群用于存储Kubernetes的状态数据,确保数据的高可用性和一致性。
示例代码:部署ETCD集群
apiVersion: v1
kind: Pod
metadata:
name: etcd0
namespace: kube-system
spec:
containers:
- name: etcd
image: quay.io/coreos/etcd:v3.4.13
command:
- /usr/local/bin/etcd
- --name=etcd0
- --data-dir=/var/lib/etcd
- --initial-advertise-peer-urls=http://etcd0:2380
- --listen-peer-urls=http://0.0.0.0:2380
- --listen-client-urls=http://0.0.0.0:2379
- --advertise-client-urls=http://etcd0:2379
- --initial-cluster-token=etcd-cluster-1
- --initial-cluster=etcd0
=http://etcd0:2380,etcd1=http://etcd1:2380,etcd2=http://etcd2:2380
- --initial-cluster-state=new
volumes:
- name: etcd-data
hostPath:
path: /var/lib/etcd
9.3 跨区域集群
跨区域集群通过在多个地理区域部署节点,确保集群的高可用性和低延迟。
示例代码:部署跨区域集群
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
loadBalancerSourceRanges:
- "0.0.0.0/0"
- "192.168.1.0/24"
10. 案例分析
10.1 高可用Web应用
使用Kubernetes实现高可用的Web应用,确保应用的稳定性和可扩展性。
示例代码:部署高可用Web应用
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 3
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
type: LoadBalancer
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 80
10.2 分布式数据库
使用Kubernetes部署分布式数据库,实现数据的高可用性和一致性。
示例代码:部署分布式数据库
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "example"
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None
selector:
app: mysql
10.3 数据分析平台
使用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. 总结
Kubernetes作为现代应用的基础架构平台,提供了丰富的功能和强大的管理能力。通过深入了解Kubernetes的高级应用,包括高级网络、存储、安全、自动化运维、多租户、监控和日志、扩展以及高可用性等方面,可以更好地利用Kubernetes实现应用的自动化部署、扩展和管理。