# 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的专家用户。

发表回复

后才能评论