# Kubernetes入门教程
Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。本教程将带您从零开始学习Kubernetes的核心概念和基本操作。
1. Kubernetes基本概念
在开始使用Kubernetes之前,我们需要了解几个核心概念:
- **Pod**:Kubernetes中最小的部署单元,包含一个或多个紧密关联的容器
- **Deployment**:管理Pod的控制器,负责创建、更新和扩展Pod
- **Service**:为Pod提供稳定的网络接口,实现服务发现和负载均衡
- **Namespace**:将集群划分为多个虚拟集群,实现资源隔离
- **Node**:Kubernetes集群中的工作机器,可以是虚拟机或物理机
- **Cluster**:由多个Node组成的Kubernetes集群
2. 安装和配置Kubernetes
2.1 安装Minikube(本地开发环境)
Minikube是在本地运行单节点Kubernetes集群的工具,非常适合学习和开发。
# 下载Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动Minikube集群
minikube start
2.2 安装kubectl
kubectl是Kubernetes的命令行工具,用于与集群交互。
# 下载kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# 验证安装
kubectl version --client
2.3 连接到集群
# 查看集群信息
kubectl cluster-info
# 查看节点状态
kubectl get nodes
3. 创建和管理Pod
3.1 创建一个简单的Pod
创建一个名为`pod.yaml`的文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
使用kubectl创建Pod:
kubectl apply -f pod.yaml
3.2 查看Pod状态
# 查看所有Pod
kubectl get pods
# 查看详细信息
kubectl describe pod nginx-pod
3.3 访问Pod
# 转发端口到本地
kubectl port-forward nginx-pod 8080:80
# 在另一个终端访问
curl http://localhost:8080
3.4 删除Pod
kubectl delete pod nginx-pod
4. 使用Deployment管理应用
4.1 创建Deployment
创建一个名为`deployment.yaml`的文件:
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.21
ports:
- containerPort: 80
创建Deployment:
kubectl apply -f deployment.yaml
4.2 查看Deployment和Pod状态
# 查看Deployment
kubectl get deployments
# 查看Pod(应该看到3个Pod)
kubectl get pods
4.3 扩展应用
# 扩展到5个副本
kubectl scale deployment/nginx-deployment --replicas=5
# 再次查看Pod
kubectl get pods
4.4 更新应用
修改`deployment.yaml`中的镜像版本为`nginx:1.22`,然后应用更新:
kubectl apply -f deployment.yaml
# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment
4.5 回滚更新
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
5. 使用Service暴露应用
5.1 创建Service
创建一个名为`service.yaml`的文件:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
创建Service:
kubectl apply -f service.yaml
5.2 访问Service
# 查看Service
kubectl get services
# 获取Service IP(如果是Minikube)
minikube service nginx-service --url
# 访问Service(使用返回的URL)
curl <minikube-service-url>
6. 使用Python操作Kubernetes
Kubernetes提供了Python客户端库,可以编程方式管理集群资源。首先安装库:
pip install kubernetes
6.1 配置认证
# 代码示例:配置Kubernetes认证
from kubernetes import client, config
# 加载kubeconfig文件
config.load_kube_config()
# 创建API客户端
api_instance = client.CoreV1Api()
# 测试连接
try:
api_response = api_instance.list_namespace()
print("Connected to Kubernetes cluster, found", len(api_response.items), "namespaces")
except Exception as e:
print("Error connecting to cluster: %s\n" % e)
6.2 创建Pod
# 代码示例:创建一个Nginx Pod
from kubernetes import client, config
config.load_kube_config()
api_instance = client.CoreV1Api()
# 定义Pod清单
pod_manifest = {
"apiVersion": "v1",
"kind": "Pod",
"metadata": {
"name": "python-nginx-pod"
},
"spec": {
"containers": [{
"name": "nginx",
"image": "nginx:1.21",
"ports": [{
"containerPort": 80
}]
}]
}
}
# 创建Pod
try:
api_response = api_instance.create_namespaced_pod(
body=pod_manifest,
namespace="default"
)
print("Pod created. status='%s'" % str(api_response.status.phase))
except client.ApiException as e:
print("Exception when creating Pod: %s\n" % e)
6.3 列出所有Pod
# 代码示例:列出所有Pod
from kubernetes import client, config
config.load_kube_config()
api_instance = client.CoreV1Api()
try:
# 列出default命名空间中的所有Pod
pod_list = api_instance.list_namespaced_pod(namespace="default")
print("Found %d pods in default namespace:" % len(pod_list.items))
for pod in pod_list.items:
print("- %s\t%s\t%s" % (pod.metadata.name, pod.status.phase, pod.status.pod_ip))
except client.ApiException as e:
print("Exception when listing Pods: %s\n" % e)
6.4 删除Pod
# 代码示例:删除Pod
from kubernetes import client, config
config.load_kube_config()
api_instance = client.CoreV1Api()
pod_name = "python-nginx-pod"
try:
api_response = api_instance.delete_namespaced_pod(
name=pod_name,
namespace="default",
body=client.V1DeleteOptions()
)
print("Pod %s deleted. status='%s'" % (pod_name, str(api_response.status)))
except client.ApiException as e:
print("Exception when deleting Pod: %s\n" % e)
7. 使用Namespace隔离资源
7.1 创建Namespace
创建一个名为`namespace.yaml`的文件:
apiVersion: v1
kind: Namespace
metadata:
name: development
创建Namespace:
kubectl apply -f namespace.yaml
7.2 在Namespace中创建资源
创建一个在development命名空间中的Pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx-dev-pod
namespace: development
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
应用配置:
kubectl apply -f dev-pod.yaml
7.3 查看Namespace中的资源
# 查看所有Namespace
kubectl get namespaces
# 查看development命名空间中的Pod
kubectl get pods -n development
8. 使用ConfigMap管理配置
8.1 创建ConfigMap
创建一个名为`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;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
创建ConfigMap:
kubectl apply -f configmap.yaml
8.2 使用ConfigMap
创建一个使用ConfigMap的Pod:
apiVersion: v1
kind: Pod
metadata:
name: nginx-configmap-pod
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
volumeMounts:
- name: nginx-config-volume
mountPath: /etc/nginx/conf.d/
volumes:
- name: nginx-config-volume
configMap:
name: nginx-config
items:
- key: nginx.conf
path: default.conf
应用配置:
kubectl apply -f configmap-pod.yaml
9. 使用Secret管理敏感数据
9.1 创建Secret
从命令行创建Secret:
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password='S!B@d92b'
9.2 使用Secret
创建一个使用Secret的Pod:
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: busybox
image: busybox:1.28
command: ["sleep", "3600"]
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
应用配置:
kubectl apply -f secret-pod.yaml
9.3 验证Secret
# 查看Pod的环境变量
kubectl exec secret-pod -- env | grep DB
总结
本教程详细介绍了Kubernetes的核心概念和基本操作,包括:
1. Kubernetes的基本概念和架构
2. 使用Minikube搭建本地开发环境
3. Pod的创建、管理和访问
4. 使用Deployment实现应用的部署、扩展和更新
5. 通过Service暴露应用并提供网络访问
6. 使用Python客户端库编程操作Kubernetes
7. 使用Namespace实现资源隔离
8. 通过ConfigMap管理应用配置
9. 使用Secret安全地管理敏感数据
通过本教程的学习,您应该能够理解Kubernetes的基本工作原理,并能够执行常见的容器编排任务。要进一步提升技能,建议探索更高级的主题如Ingress、持久化存储、Helm包管理器以及Kubernetes监控和日志系统。
Kubernetes是一个功能强大的平台,掌握它将为您的容器化应用部署和管理带来巨大的便利。继续实践和探索,您将逐渐成为Kubernetes的专家用户。





