zoukankan      html  css  js  c++  java
  • Kubernetes容器化工具Kind实践部署Kubernetes v1.18.x 版本, 发布WordPress和MySQL

    Kind 介绍

    Kind是Kubernetes In Docker的缩写,顾名思义是使用Docker容器作为Node并将Kubernetes部署至其中的一个工具。官方文档中也把Kind作为一种本地集群搭建的工具进行推荐。默认情况下,Kind会先下载kindest/node镜像,该镜像包含kubernetes的主要组件,当镜像节点准备好时,Kind使用kubeadm进行集群的创建,内部使用containerd跑组件容器。最终,Kind只是为了方便测试kubernetes集群的,且不可用于生产环境。

    部署Kind

    Kind使用Golang进行开发,在仓库的Release页面,已经上传了构建好的二进制,支持多种操作系统,可直接按需下载进行使用。

    wget -O /usr/local/bin/kind https://github.com/kubernetes-sigs/kind/releases/download/v0.8.1/kind-linux-amd64 && chmod +x /usr/local/bin/kind
    
    # kind v0.8.1版本支持最新kubernetes v1.18.2集群
    

    安装docker

    yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
    sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
    yum install -y docker-ce
    
    

    部署kubectl

    wget -O /usr/local/bin/kubctl https://storage.googleapis.com/kubernetes-release/release/v1.18.5/bin/linux/amd64/kubectl
    chmod +x /usr/local/bin/kubectl
    
    

    创建kind单集群

    使用kind命令创建

    使用kind create 创建集群,默认是单节点集群。

    # kind create cluster --name test
    Creating cluster "test" ...
     ✓ Ensuring node image (kindest/node:v1.18.2) 
     ✓ Preparing nodes 
     ✓ Creating kubeadm config 
     ✓ Starting control-plane ️ 
     ✓ Installing CNI 
     ✓ Installing StorageClass 
    
    Cluster creation complete. You can now use the cluster with:
    
    export KUBECONFIG="$(kind get kubeconfig-path --name="test")"
    kubectl cluster-info
    
    

    在docker环境下,会启动一个镜像

    CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
    2e0a5e15a4a0        kindest/node:v1.18.2               "/usr/local/bin/entr…"   14 minutes ago      Up 14 minutes       45319/tcp, 127.0.0.1:45319->6443/tcp    test-control-plane
    
    

    查看集群信息

    export KUBECONFIG="$(kind get kubeconfig-path --name="test")"
    echo 'export KUBECONFIG="$(kind get kubeconfig-path --name=test)"' >> /root/.bashrc
    
    
    kubectl cluster-info
    Kubernetes master is running at https://localhost:45319
    KubeDNS is running at https://localhost:45319/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    
    To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
    
    kubectl get node -o wide
    NAME                 STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                                  KERNEL-VERSION          CONTAINER-RUNTIME
    test-control-plane   Ready    master   16m   v1.18.2   172.17.0.2    <none>        Ubuntu Disco Dingo (development branch)   3.10.0-693.el7.x86_64   containerd://1.2.6-0ubuntu1
    
    kubectl get pods --all-namespaces
    NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
    kube-system   coredns-fb8b8dccf-6r58d                      1/1     Running   0          17m
    kube-system   coredns-fb8b8dccf-bntk8                      1/1     Running   0          17m
    kube-system   etcd-test-control-plane                      1/1     Running   0          17m
    kube-system   ip-masq-agent-qww8n                          1/1     Running   0          17m
    kube-system   kindnet-vbz6w                                1/1     Running   0          17m
    kube-system   kube-apiserver-test-control-plane            1/1     Running   0          16m
    kube-system   kube-controller-manager-test-control-plane   1/1     Running   0          17m
    kube-system   kube-proxy-wf7dq                             1/1     Running   0          17m
    kube-system   kube-scheduler-test-control-plane            1/1     Running   0          16m
    
    

    启动nginx app

    kubectl run nginx --image nginx:1.17.0-alpine --restart=Never --port 80 --labels="app=nginx-test"
    
    kubectl port-forward --address 0.0.0.0 pod/nginx 8080:80
    curl localhost:8080
    

    指定配置文件创建

    # cat kube-config.yaml
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    kubeadmConfigPatches:
    - |
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterConfiguration
      metadata:
        name: config
      networking:
        serviceSubnet: 10.0.0.0/16
      imageRepository: registry.aliyuncs.com/google_containers
      nodeRegistration:
        kubeletExtraArgs:
          pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
    - |
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: InitConfiguration
      metadata:
        name: config
      networking:
        serviceSubnet: 10.0.0.0/16
      imageRepository: registry.aliyuncs.com/google_containers
    nodes:  # 指定节点,默认是一个节点
    - role: control-plane
    
    # kind create cluster --name test2 --config kube-config.yaml
    Creating cluster "test2" ...
     ✓ Ensuring node image (kindest/node:v1.18.2) 
     ✓ Preparing nodes 
     ✓ Creating kubeadm config 
     ✓ Starting control-plane ️ 
     ✓ Installing CNI 
     ✓ Installing StorageClass 
                                Cluster creation complete. You can now use the cluster with:
    
    export KUBECONFIG="$(kind get kubeconfig-path --name="test2")"
    kubectl cluster-info
    
    

    创建kind-ha集群

    只能通过配置文件来声明ha集群配置

    # cat kind-ha-config.yaml
    kind: Cluster
    apiVersion: kind.sigs.k8s.io/v1alpha3
    kubeadmConfigPatches:
    - |
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterConfiguration
      metadata:
        name: config
      networking:
        serviceSubnet: 10.0.0.0/16
      imageRepository: registry.aliyuncs.com/google_containers
      nodeRegistration:
        kubeletExtraArgs:
          pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
    - |
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: InitConfiguration
      metadata:
        name: config
      networking:
        serviceSubnet: 10.0.0.0/16
      imageRepository: registry.aliyuncs.com/google_containers
    nodes:  #主要修改这个位置,增加role,指定node节点,工作节点名称必须为worker,master节点必须为control-plane
    - role: control-plane
    - role: control-plane
    - role: control-plane
    - role: worker
    - role: worker
    - role: worker
    
    # kind create cluster --name test-ha --config kind-ha-config.yaml
    Creating cluster "test-ha" ...
     ✓ Ensuring node image (kindest/node:v1.18.2) 
     ✓ Preparing nodes 
     ✓ Configuring the external load balancer ⚖️ 
     ✓ Creating kubeadm config 
     ✓ Starting control-plane ️ 
     ✓ Installing CNI 
     ✓ Installing StorageClass 
     ✓ Joining more control-plane nodes 
     ✓ Joining worker nodes 
    
                             Cluster creation complete. You can now use the cluster with:
    
    export KUBECONFIG="$(kind get kubeconfig-path --name="test3")"
    kubectl cluster-info
    
    
    # kubectl get nodes
    NAME                   STATUS   ROLES    AGE     VERSION
    test3-control-plane    Ready    master   7m44s   v1.18.2
    test3-control-plane2   Ready    master   4m59s   v1.18.2
    test3-control-plane3   Ready    master   2m18s   v1.15.0
    test3-worker           Ready    <none>   110s    v1.15.0
    test3-worker2          Ready    <none>   109s    v1.15.0
    test3-worker3          Ready    <none>   105s    v1.15.0
    
    

    常用操作

    kind 是基于 docker 的,那么我们再来看下 docker 资源,来验证一下是否真的是基于 docker 的?

    # 本机执行,就会提示有个docker容器正在运行,可以看到 docker 里有一个 container,而 kind 创建的集群就是基于这个 container 的,如果你直接删掉了这个 container,通过 kind 创建的 k8s 集群也会有问题
    
    docker ps
    CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
    2e0a5e15a4a0        kindest/node:v1.18.2               "/usr/local/bin/entr…"   14 minutes ago      Up 14 minutes       45319/tcp, 127.0.0.1:45319->6443/tcp    test-control-plane
    

    再来看一下 network,运行 docker network ls,可以看到有一个名称为 kind 的 network。

    docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    94de31154cb7        bridge              bridge              local
    0c31de104d44        host                host                local
    a667b873436d        kind                bridge              local
    6083dbc308a4        none                null                local
    

    我们可以进一步探究 kind-control-plane(就是上面的 docker container)

    通过 docker exec kind-control-plane crictl ps 获取这个容器内部的运行容器列表,这个容器内部通过 crictl 来操作容器,可以参考 https://github.com/kubernetes-sigs/cri-tools,crtctl 主要用来管理容器,命令使用和docker命令是一样,可以通过 docker exec kind-control-plane crictl help 帮助查看命令使用方法。

    # master 节点
    docker exec kind-ha-control-plane crictl ps
    CONTAINER           IMAGE               CREATED             STATE               NAME                      ATTEMPT             POD ID
    4b62cd954c86a       ace0a8c17ba90       18 minutes ago      Running             kube-controller-manager   3                   8f000bb1c20f3
    90552a29c50d9       db10073a6f829       19 minutes ago      Running             local-path-provisioner    8                   7e648bc7297b1
    268f41443c426       a3099161e1375       19 minutes ago      Running             kube-scheduler            4                   a64377f98d627
    aa3fea2edc80d       67da37a9a360e       3 hours ago         Running             coredns                   0                   719884414c5f4
    04c58978f5395       67da37a9a360e       3 hours ago         Running             coredns                   0                   da6e08629ac71
    110429a5a873b       2186a1a396deb       3 hours ago         Running             kindnet-cni               0                   5359903320ef9
    1c125b02f6300       0d40868643c69       3 hours ago         Running             kube-proxy                0                   9ba4d0a1fdd3d
    0301cd4d26d9c       6ed75ad404bdd       3 hours ago         Running             kube-apiserver            0                   4905e2b2a8a1a
    435ee12a45bff       303ce5db0e90d       3 hours ago         Running             etcd                      0                   96f4e9190bede
    
    # worker节点
    docker exec kind-ha-worker crictl ps
    CONTAINER           IMAGE               CREATED             STATE               NAME                ATTEMPT             POD ID
    5e82bf4756b6f       bfba26ca350c1       21 minutes ago      Running             nginx               0                   78d1324b8b1a1
    ea02b20040341       0d40868643c69       3 hours ago         Running             kube-proxy          0                   de6a57d0b7381
    c2aa986df532f       2186a1a396deb       3 hours ago         Running             kindnet-cni         1                   ebea7a329cfe0
    
    

    获取 k8s 集群所有资源示例

    kubectl get all --all-namespaces
    

    获取集群外部的config配置配置文件

    kind  get kubeconfig --name kind-ha
    

    获取集群内部的config配置配置文件(一般获取外部就够用了)

    kind  get kubeconfig --internal --name kind-ha
    

    删除集群(清理很方便)

    kind delete cluster --name test
    

    挂载文件

    nodes:
    - role: control-plane
      extraMounts:
        - containerPath: /etc/docker/daemon.json
          hostPath: /etc/docker/daemon.json
          readOnly: true
    

    暴露端口方法1

    nodes:
    - role: control-plane
      extraPortMappings:
        - containerPort: 30080
          hostPort: 30080
    

    有时候我们想暴露svc的端口给外部访问,因为kubernetes的节点是在docker容器中,所以还需要容器暴露svc的端口,外部才能通过宿主机访问。

    暴露端口方法2

    # 使用端口转发的方式
    
    kubectl port-forward --address 0.0.0.0 pod/nginx 8080:80
    

    从私有仓库下载镜像

    docker exec test-drone-control-plane bash -c "sed -i '56a        [plugins.cri.registry.mirrors."192.168.77.134:5000"]' /etc/containerd/config.toml" 
    docker exec test-drone-control-plane bash -c "sed -i '57a          endpoint = ["http://192.168.77.134:5000"]' /etc/containerd/config.toml" 
    docker exec test-drone-control-plane bash -c "cat /etc/containerd/config.toml"
    docker exec test-drone-control-plane bash -c 'kill -s SIGHUP $(pgrep containerd)'
    COPY
    

    还可以通过挂载文件的方式,挂载containerd的配置文件

    重启集群

    docker stop test-drone-control-plane
    docker start test-drone-control-plane
    COPY
    

    总之,kind可以很方便的在docker环境下创建测试集群,而不污染我们的宿主机,给我们测试提供了很大的便利。

    示例:使用持久卷部署WordPress和MySQL

    本教程向您展示如何使用Kind部署WordPress网站和MySQL数据库。这两个应用程序都使用PersistentVolumes和PersistentVolumeClaims来存储数据。

    PersistentVolume(PV)是已经由管理员手动供应,或动态地使用由Kubernetes置备集群中的一块存储的StorageClassPersistentVolumeClaim(PVC)是由能够由PV满足用户对于存储的请求。PersistentVolumes和PersistentVolumeClaims与Pod生命周期无关,并通过重新启动,重新计划甚至删除Pod来保留数据。

    警告:此部署不适合生产用例,因为它使用单实例WordPress和MySQL Pods。考虑使用WordPress Helm Chart在生产中部署WordPress。

    注意:本教程中提供的文件使用的是GA Deployment API,并且特定于kubernetes 1.9和更高版本。如果您希望将本教程与Kubernetes的早期版本一起使用,请相应地更新API版本,或参考本教程的早期版本。

    目标

    • 创建PersistentVolumeClaims和PersistentVolumes
    • 创建一个kustomization.yaml
      • Secret密码配置
      • MySQL资源配置
      • WordPress资源配置
    • 通过以下方式应用Kustomization目录 kubectl apply -k ./
    • 清理

    在你开始之前

    您需要具有Kubernetes集群,并且必须将kubectl命令行工具配置为与集群通信。如果还没有集群,则可以使用Minikube或者是Kind创建一个集群,也 可以使用以下Kubernetes游乐场之一:

    要检查版本,请输入kubectl version。此页面上显示的示例适用于kubectl1.14及更高版本,上面我们已经创建了kind-ha集群,直接执行后面的步骤既可。

    kubectl version
    Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
    Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:48:36Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
    

    下载以下配置文件:

    1. mysql-deployment.yaml
    2. wordpress-deployment.yaml

    创建PersistentVolumeClaims和PersistentVolumes

    MySQL和Wordpress都需要一个PersistentVolume来存储数据。他们的PersistentVolumeClaims将在部署步骤中创建。

    许多集群环境都安装了默认的StorageClass。如果在PersistentVolumeClaim中未指定StorageClass,则使用群集的默认StorageClass。

    创建PersistentVolumeClaim后,将根据StorageClass配置动态设置PersistentVolume。

    # 查看StorageClass
    kubectl get sc
    
    kubectl describe  sc $(kubectl get sc |grep default|awk 'NR==2{print $1}')
    

    警告:在本地集群中,默认的StorageClass使用hostPath配置程序。hostPath该卷仅适用于开发和测试。有了hostPath卷,您的数据/tmp将驻留在Pod调度到的节点上,并且不会在节点之间移动。如果Pod死亡并被调度到群集中的另一个节点,或者该节点被重新引导,则数据将丢失。

    注意:如果要启动需要使用hostPath配置程序的群集,则--enable-hostpath-provisioner必须在controller-manager组件中设置该标志。

    注意:如果您有一个在Kubernetes Engine上运行的Kubernetes集群,请遵循本指南

    创建一个Secret密码文件kustomization.yaml

    secret是一个对象,其存储了一块如密码或密钥的敏感数据。从1.14开始,kubectl支持使用kustomization文件管理Kubernetes对象。您可以通过中的生成器创建Secret kustomization.yaml

    kustomization.yaml从以下命令中添加一个Secret生成器。您将需要替换YOUR_PASSWORD为您要使用的密码。

    cat <<EOF >./kustomization.yaml
    secretGenerator:
    - name: mysql-pass
      literals:
      - password=YOUR_PASSWORD
    EOF
    

    为MySQL和WordPress添加资源配置

    以下清单描述了单实例MySQL部署。MySQL容器将PersistentVolume挂载在/ var / lib / mysql。在MYSQL_ROOT_PASSWORD环境变量设置从secret数据库密码。

    application/wordpress/mysql-deployment.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      ports:
        - port: 3306
      selector:
        app: wordpress
        tier: mysql
      clusterIP: None
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pv-claim
      labels:
        app: wordpress
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    ---
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: wordpress-mysql
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: mysql
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: wordpress
            tier: mysql
        spec:
          containers:
          - image: mysql:5.6
            name: mysql
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pv-claim
    

    以下清单描述了单实例WordPress部署。WordPress容器将PersistentVolume安装在/var/www/html用于网站数据文件的位置。在WORDPRESS_DB_HOST环境变量设置上面定义的MySQL服务的名称,WordPress会由服务访问数据库。在 WORDPRESS_DB_PASSWORD环境变量设置从生成的秘密kustomize数据库密码。

    application/wordpress/wordpress-deployment.yaml

    application/wordpress/wordpress-deployment.yaml 
    
    apiVersion: v1
    kind: Service
    metadata:
      name: wordpress
      labels:
        app: wordpress
    spec:
      ports:
        - port: 80
      selector:
        app: wordpress
        tier: frontend
      type: LoadBalancer
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: wp-pv-claim
      labels:
        app: wordpress
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    ---
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
      name: wordpress
      labels:
        app: wordpress
    spec:
      selector:
        matchLabels:
          app: wordpress
          tier: frontend
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: wordpress
            tier: frontend
        spec:
          containers:
          - image: wordpress:4.8-apache
            name: wordpress
            env:
            - name: WORDPRESS_DB_HOST
              value: wordpress-mysql
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 80
              name: wordpress
            volumeMounts:
            - name: wordpress-persistent-storage
              mountPath: /var/www/html
          volumes:
          - name: wordpress-persistent-storage
            persistentVolumeClaim:
              claimName: wp-pv-claim
    

    使用curl 命令直接下载配置文件

    1. 下载MySQL部署配置文件。

      curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
      
    2. 下载WordPress配置文件。

      curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
      
    3. 将它们添加到kustomization.yaml文件。

      cat <<EOF >>./kustomization.yaml
      resources:
        - mysql-deployment.yaml
        - wordpress-deployment.yaml
      EOF
      

    执行并验证

    kustomization.yaml包含用于部署WordPress网站和MySQL数据库的所有资源。您可以通过以下方式启动应用

    kubectl apply -k ./
    

    现在,您可以验证所有对象是否存在。

    1. 通过运行以下命令来验证机密是否存在:

      kubectl get secrets
      

      响应应如下所示:

      NAME                    TYPE                                  DATA   AGE
      mysql-pass-c57bb4t7mf   Opaque                                1      9s
      
    2. 验证是否已动态配置PersistentVolume。

      kubectl get pvc
      

      注意:设置和绑定PV可能要花费几分钟。

      响应应如下所示:

      NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
      mysql-pv-claim   Bound     pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
      wp-pv-claim      Bound     pvc-8cd0df54-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
      
    3. 通过运行以下命令来验证Pod是否正在运行:

      kubectl get pods
      

      注意: Pod的状态最多可能需要几分钟的时间RUNNING

      响应应如下所示:

      NAME                               READY     STATUS    RESTARTS   AGE
      wordpress-mysql-1894417608-x5dzt   1/1       Running   0          40s
      
    4. 通过运行以下命令来验证服务是否正在运行:

      kubectl get services wordpress
      

      响应应如下所示:

      NAME        TYPE            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
      wordpress   LoadBalancer    10.0.0.89    <pending>     80:32406/TCP   4m
      

      注意: Minikube只能通过公开服务NodePort。EXTERNAL-IP始终处于挂起状态。

      ​ 当前我使用的是kind创建集群,可以直接通过端口转发方式,进行访问WordPress页面

    5. 运行以下命令以获取WordPress服务的IP地址:

      kubectl port-forword --address 0.0.0.0 svc/wordpress 8000:80 
      
    6. 复制IP地址,然后将页面加载到浏览器中以查看您的站点。

      您应该看到类似于以下屏幕截图的WordPress设置页面。

      wordpress初始化

    警告:请勿在此页面上保留WordPress安装。如果其他用户找到了它,他们可以在您的实例上建立一个网站并使用它来提供恶意内容。

    通过创建用户名和密码来安装WordPress或删除您的实例。

    删除WordPress

    1. 运行以下命令以删除您的密钥,部署,服务和PersistentVolumeClaims:

      kubectl delete -k ./
      
  • 相关阅读:
    bootstrap添加多个模态对话框支持
    突然想写书
    几个常用的内存、CPU飙高 分析工具
    steeltoe学习
    thrift简单使用
    记一次线上Mysql数据库 宕机
    .NetCore 开发生产环境项目前的思考&&踩坑
    SOA(面向服务架构)——踩坑后反思:这样值得吗?
    ProtoBuf与Newtonsoft序列化反序列化性能对比
    SimpleInjector 简单使用
  • 原文地址:https://www.cnblogs.com/passzhang/p/13300860.html
Copyright © 2011-2022 走看看