mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
224 字
1 分钟
Kubernetes 网络与存储
2024-07-24

一、Kubernetes 网络模型#

1.1 网络原则#

graph LR A["Pod 1"] -->|同一 Node| B["Pod 2"] A -->|跨 Node| C["Pod 3"] style A fill:#87CEEB style B fill:#87CEEB style C fill:#90EE90
原则说明
Pod 间通信所有 Pod 可以直接通信,无需 NAT
Node 与 PodNode 可以与所有 Pod 通信,无需 NAT
Pod 自身 IP每个 Pod 有独立的 IP,不依赖端口映射

1.2 CNI 网络插件#

# CNI: Container Network Interface
# 常见 CNI 插件
# 1. Calico - 网络策略优先
# 2. Flannel - 简单 overlay 网络
# 3. Cilium - eBPF 驱动
# 4. Weave Net - 自动加密

二、Service#

2.1 Service 类型#

# ClusterIP - 内部访问(默认)
apiVersion: v1
kind: Service
metadata:
name: nginx-clusterip
spec:
type: ClusterIP
selector:
app: nginx
ports:
- port: 80 # Service 端口
targetPort: 80 # Pod 端口
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 30000-32767
---
apiVersion: v1
kind: Service
metadata:
name: nginx-lb
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 80
targetPort: 80

2.2 Headless Service#

# Headless Service - 无负载均衡
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
spec:
clusterIP: None # 关键设置
selector:
app: nginx
ports:
- port: 80
# DNS 行为
# 普通 Service: my-svc.namespace.svc.cluster.local -> ClusterIP
# Headless: pod-name.my-svc.namespace.svc.cluster.local -> Pod IP

2.3 Service 发现#

# 环境变量方式(自动注入)
# 格式: {SVCNAME}_SERVICE_HOST, {SVCNAME}_SERVICE_PORT
NGINX_SERVICE_HOST=10.0.0.100
NGINX_SERVICE_PORT=80
# DNS 方式
# 格式: <service-name>.<namespace>.svc.cluster.local
nginx.default.svc.cluster.local

2.4 kube-proxy 模式#

# iptables 模式(默认)
# 规则匹配,性能随规则增加下降
# IPVS 模式(大规模推荐)
# 支持负载均衡算法:rr, wrr, lc, wlc, sh, dh
# 查看模式
kubectl get configmap kube-proxy -n kube-system -o yaml

三、Ingress#

3.1 Ingress 配置#

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /static
pathType: Prefix
backend:
service:
name: static-service
port:
number: 80

3.2 IngressClass#

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: k8s.io/ingress-nginx

四、NetworkPolicy#

4.1 默认拒绝#

# 默认拒绝所有入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {}
policyTypes:
- Ingress

4.2 允许特定流量#

# 允许前端访问后端
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-dns
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector: {}
ports:
- protocol: UDP
port: 53

五、存储卷#

5.1 卷类型对比#

类型说明生命周期
emptyDir临时存储与 Pod 相同
hostPath节点文件系统持久
persistentVolumeClaim持久存储独立于 Pod
configMap配置数据可独立更新
secret敏感数据安全存储
nfs网络文件系统持久

5.2 emptyDir#

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test
image: alpine
volumeMounts:
- name: cache
mountPath: /tmp
volumes:
- name: cache
emptyDir:
sizeLimit: 100Mi
medium: Memory # 内存存储

5.3 hostPath#

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: test
image: alpine
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
hostPath:
path: /var/local/data
type: DirectoryOrCreate # 不存在则创建

5.4 NFS#

apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
spec:
containers:
- name: app
image: alpine
volumeMounts:
- name: nfs-volume
mountPath: /mnt/nfs
volumes:
- name: nfs-volume
nfs:
server: nfs-server.example.com
path: /share

六、持久化存储#

6.1 PV 与 PVC#

# PersistentVolume (PV) - 管理员创建
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce # 单节点读写
# - ReadOnlyMany # 多节点只读
# - ReadWriteMany # 多节点读写
storageClassName: standard
persistentVolumeReclaimPolicy: Retain # Retain/Delete/Recycle
nfs:
server: nfs-server
path: /data/pv-1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-1
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: standard

6.2 StorageClass#

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: pd.csi.storage.gke.io # GCP
parameters:
type: pd-ssd
filesystem: xfs
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer # 延迟绑定
allowVolumeExpansion: true

6.3 动态存储#

# 使用 StorageClass 自动创建 PV
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: dynamic-pvc
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

七、ConfigMap 与 Secret#

7.1 ConfigMap#

apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.json: |
{
"database": {
"host": "db-service",
"port": 5432
}
}
log-level: "info"
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: app:latest
envFrom:
- configMapRef:
name: app-config
env:
- name: DB_PASSWORD
valueFrom:
configMapKeyRef:
name: app-config
key: log-level

7.2 Secret#

apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
data:
# echo -n "password" | base64
db-password: cGFzc3dvcmQ=
stringData:
# 自动 Base64 编码
api-key: "my-secret-key"
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: app:latest
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secrets
key: db-password
volumeMounts:
- name: secrets
mountPath: /etc/secrets
volumes:
- name: secrets
secret:
secretName: app-secrets

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Kubernetes 网络与存储
https://blog.souloss.com/posts/interview/kubernetes-networking-and-storage/
作者
Souloss
发布于
2024-07-24
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时