自动化运维(十七)Ansible 之Kubernetes模块

Ansible的Kubernetes模块允许我们使用Ansible playbook来管理Kubernetes集群上的资源,如Deployment、Service、Pod等。通过这些模块,我们可以定义Kubernetes资源的期望状态,Ansible会自动与Kubernetes API server通信,确保实际状态与期望状态一致。

以下是一些常用的Kubernetes模块:

1、k8s模块

k8s模块是最基础和通用的模块,可以用于管理任意的Kubernetes资源。例如,以下任务创建一个Deployment:

- name: Create a deployment
  k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-deployment
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: my-app
        template:
          metadata:
            labels:
              app: my-app
          spec:
            containers:
            - name: my-container
              image: my-image:v1

该任务使用YAML格式定义了一个Deployment,指定了副本数、标签选择器、容器镜像等属性。当state参数为present时,如果Deployment不存在,则创建它;如果已存在,则更新它。

2、k8s_info模块

k8s_info模块用于获取Kubernetes资源的信息。例如,以下任务获取所有的Pod信息:

- name: Get pod information
  k8s_info:
    kind: Pod
  register: pod_info

- name: Print pod information
  debug:
    var: pod_info

该任务指定了要获取的资源类型为Pod,并将获取到的信息注册到pod_info变量中,然后使用debug模块打印出来。

3、k8s_scale模块

k8s_scale模块用于扩缩Kubernetes Deployment等资源的副本数。例如,以下任务将一个Deployment的副本数扩展到5:

- name: Scale deployment
  k8s_scale:
    kind: Deployment
    name: my-deployment
    replicas: 5

该任务指定了要扩缩的资源类型、名称和目标副本数。

4、k8s_service模块

k8s_service模块用于管理Kubernetes Service资源。例如,以下任务创建一个LoadBalancer类型的Service:

- name: Create a service
  k8s_service:
    state: present
    name: my-service
    namespace: default
    ports:
    - port: 80
      target_port: 8080
    selector:
      app: my-app
    type: LoadBalancer

该任务指定了Service的名称、命名空间、端口映射、标签选择器和类型。

5、完成示例

下面是一个完整的playbook示例,展示了如何使用Kubernetes模块部署一个简单的Web应用:

---
- hosts: localhost
  tasks:
    - name: Create a deployment
      k8s:
        state: present
        definition:
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: my-deployment
          spec:
            replicas: 3
            selector:
              matchLabels:
                app: my-app
            template:
              metadata:
                labels:
                  app: my-app
              spec:
                containers:
                - name: my-container
                  image: nginx:latest
                  ports:
                  - containerPort: 80

    - name: Create a service
      k8s_service:
        state: present
        name: my-service
        namespace: default
        ports:
        - port: 80
          target_port: 80
        selector:
          app: my-app

这个playbook首先使用k8s模块创建了一个Deployment,指定了3个副本,使用nginx镜像,并将容器的80端口暴露出来。

然后,使用k8s_service模块创建了一个Service,将服务的80端口映射到容器的80端口,并使用标签选择器将服务与之前创建的Deployment关联起来。

运行这个playbook后,Ansible会与Kubernetes API server通信,创建Deployment和Service。然后,我们就可以通过Service的IP地址或者如果是LoadBalancer类型的Service,通过外部IP地址来访问我们的Web应用了。

使用Ansible的Kubernetes模块,我们可以用声明式的方式定义Kubernetes资源,并且可以将资源的定义版本化,存储在Git等版本控制系统中。这样,我们就可以像管理代码一样管理我们的Kubernetes基础架构了。

除了上述示例中用到的模块,Ansible还提供了一些其他的Kubernetes模块,例如:

  • k8s_exec模块,用于在容器中执行命令
  • k8s_cp模块,用于在主机和容器之间复制文件
  • helm模块,用于管理Helm包

这些模块进一步扩展了Ansible在Kubernetes领域的能力。

使用Ansible管理Kubernetes的优点包括:

  • 声明式: Ansible允许我们以声明的方式定义Kubernetes资源,只需要描述我们想要的状态,Ansible会自动完成所需的操作。
  • 幂等性: Ansible的任务是幂等的,意味着无论运行多少次,结果都是一样的。这对于维护Kubernetes集群的一致性非常重要。
  • 可测试性: 我们可以在开发环境中测试我们的playbook,确保其能够正常工作,然后再应用到生产环境中。
  • 集成性: Ansible可以与其他DevOps工具如Jenkins、GitLab等集成,实现Kubernetes应用的持续集成和持续部署。

6、实战部署

要在我们的Kubernetes集群中部署这个Web应用程序,需要确保已经配置了适当的权限和访问控制,并且Ansible可以与Kubernetes API服务器通信。

以下是一些操作步骤:

  • 安装kubectl ,具体过程请参考我的另一篇博文《如何在Linux系统和Mac上安装kubectl
  • 确保Ansible可以访问Kubernetes API服务器:您需要在Ansible控制节点上配置正确的kubeconfig文件,或者设置相应的环境变量,以便Ansible可以正确识别和连接到Kubernetes集群。针对我们自建的K8S集群,我们可以通过两种方式得到kubeconfig文件:

     (1)直接从Kubernetes Master节点获取

      如果有权访问Kubernetes集群的Master节点,可以直接从Master节点上复制kubeconfig文              件。默认情况下,Kubernetes集群的kubeconfig文件位于/etc/kubernetes/admin.conf,

  下载然后保存为Ansible控制节点的文件~/.kube/config。

      (2)使用scp命令将文件从Master节点复制到你本地的机器上,其中的<username>替换成

       为你k8s集群master服务器的帐号,<master-node-ip>这个是master节点的服务器ip

scp <username>@<master-node-ip>:/etc/kubernetes/admin.conf ~/.kube/config

然后,通过一个命令验证Ansible服务器能正常访问k8s集群:

kubectl get nodes

 我们将看到k8s集群的所有node信息,说明配置无误了。

  • 运行Ansible Playbook:将上面提供的Playbook保存为一个YAML文件(比如deploy-webapp.yaml),然后在终端中运行以下命令执行Playbook:

ansible-playbook deploy-webapp.yaml
  • 检查部署状态:执行Playbook后,Ansible会尝试在Kubernetes集群中创建Deployment和Service。您可以使用kubectl命令或者Kubernetes仪表板来验证部署的状态:
kubectl get deployments
kubectl get services
  • 访问Web应用程序:一旦部署成功,您应该能够通过Service的ClusterIP或NodePort来访问部署的Web应用程序。您可以使用kubectl port-forward命令来暴露Service的端口,并通过浏览器访问应用程序:
kubectl port-forward service/my-service 8080:80

然后在浏览器中访问http://localhost:8080就可以查看部署的Web应用程序了。

通过以上步骤,您可以在您的Kubernetes集群中成功部署这个简单的Web应用程序。如果出现任何问题,请检查Ansible与Kubernetes的连接设置以及部署过程中的任何错误消息。

相关推荐

  1. 自动化Ansible Kubernetes模块

    2024-04-10 10:44:01       39 阅读
  2. 自动化Ansible 进程管理模块

    2024-04-10 10:44:01       32 阅读
  3. 自动化(二二)Ansible实战 Jenkins模块

    2024-04-10 10:44:01       43 阅读
  4. 自动化(八)Ansible 核心模块

    2024-04-10 10:44:01       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-10 10:44:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-10 10:44:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-10 10:44:01       82 阅读
  4. Python语言-面向对象

    2024-04-10 10:44:01       91 阅读

热门阅读

  1. 未来AI技术创业机会

    2024-04-10 10:44:01       39 阅读
  2. CentOS 7详细介绍。

    2024-04-10 10:44:01       38 阅读
  3. 文心一言和GPT-4全面比较

    2024-04-10 10:44:01       37 阅读
  4. 三种芯片:ASIC、FPGA、SoC

    2024-04-10 10:44:01       38 阅读
  5. Vue将iconfont封装成全局组件,自定义类名

    2024-04-10 10:44:01       37 阅读
  6. List接口(1) | ArrayList

    2024-04-10 10:44:01       41 阅读
  7. 关于yolov8x-p2.yaml

    2024-04-10 10:44:01       36 阅读
  8. 链表,栈,队列的区别及其应用

    2024-04-10 10:44:01       32 阅读
  9. 如何生成 ssh 秘钥?

    2024-04-10 10:44:01       34 阅读
  10. 7-11完全二叉树的层序遍历

    2024-04-10 10:44:01       34 阅读