title: Kubernetes部署 date: 2024-12-28T11:09:57+08:00
初始化K8s
kubeadm init
Kubernetes 中的资源管理是分层次的,通常你会按照以下的顺序来规划和配置你的 Kubernetes 环境:
如果你希望将不同环境或应用隔离开来,通常会创建一个 Namespace(命名空间)。命名空间有助于在同一集群中隔离资源,避免冲突。
示例:创建 nginx-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nginx-namespace
创建命名空间:
kubectl apply -f nginx-namespace.yaml
使用命名空间时,记得在其他资源的 YAML 文件中指定 namespace。
创建 Persistent Volume (PV) 和 Persistent Volume Claim (PVC)
如果你需要持久化存储(例如数据库、日志等),你需要先创建 PersistentVolume (PV) 来定义存储资源,然后通过 PersistentVolumeClaim (PVC) 请求存储资源。
示例:创建 PV 和 PVC
nginx-pv.yaml(PersistentVolume)
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /mnt/data # 本地存储路径(可以替换为 NFS 或云存储)
nginx-pvc.yaml(PersistentVolumeClaim)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
创建 PV 和 PVC:
kubectl apply -f nginx-pv.yaml
kubectl apply -f nginx-pvc.yaml
创建 ConfigMap 和 Secret
如果你有配置文件或敏感信息(如数据库密码、API 密钥),可以使用 ConfigMap 和 Secret 存储这些信息。
示例:创建 ConfigMap
nginx-configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
创建 ConfigMap:
kubectl apply -f nginx-configmap.yaml
创建 Service
如果你希望让外部能够访问容器,或者在集群内部的服务之间进行通信,你需要创建一个 Service。Service 用于暴露容器的端口并进行负载均衡。
示例:创建 Service
nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 匹配容器标签
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # 如果是内部访问,可以使用 ClusterIP
创建 Service:
kubectl apply -f nginx-service.yaml
创建 Deployment
使用 Deployment 来管理容器。Deployment 确保容器的高可用性和扩缩容能力。你可以在 Deployment 中指定镜像、环境变量、存储、网络等。
示例:创建 Deployment
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx-namespace # 指定命名空间
spec:
replicas: 3 # 部署 3 个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: nginx-storage
mountPath: /usr/share/nginx/html # 挂载存储路径
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-pvc # 使用 PVC
创建 Deployment:
kubectl apply -f nginx-deployment.yaml
验证和访问
查看所有资源的状态:
kubectl get all -n nginx-namespace
如果使用 LoadBalancer 类型的 Service,并且在云平台上,Kubernetes 会为你分配一个外部 IP 地址,你可以通过该 IP 访问你的应用。
如果使用 NodePort 类型或 kubectl port-forward,可以在本地访问服务。
例如,使用 kubectl port-forward:
kubectl port-forward svc/nginx-service 8080:80 -n nginx-namespace
这样你可以通过浏览器访问 http://localhost:8080 来查看 Nginx 服务。
Namespace 隔离资源。PersistentVolume 和 PersistentVolumeClaim 为容器提供持久化存储。ConfigMap(非敏感配置)和 Secret(敏感数据)来配置容器。Service 来暴露容器,选择适合的暴露方式(如 LoadBalancer、NodePort)。Deployment 来创建和管理容器,配置副本数、更新策略、存储挂载等。这样就完成了一个基本的 Kubernetes 容器部署,涵盖了存储、网络、配置等方面。如果有其他需求(如高可用、负载均衡、复杂路由等),还可以进一步扩展和配置。