美文网首页Docker容器Kubernetes我爱编程
kubernetes(k8s) 介绍及简单例子

kubernetes(k8s) 介绍及简单例子

作者: ChainZhang | 来源:发表于2018-05-25 13:25 被阅读65次

    本文为转载,原文:kubernetes(k8s) 介绍及简单例子

    kubernetes

    1. 介绍

    Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。

    使用Kubernetes可以:

    1. 自动化容器的部署和复制
    2. 随时扩展或收缩容器规模
    3. 将容器组织成组,并且提供容器间的负载均衡
    4. 很容易地升级应用程序容器的新版本
    5. 提供容器弹性,如果容器失效就替换它,等等…

    Kubernetes解决的问题:

    1. 调度 - 容器应该在哪个机器上运行
    2. 生命周期和健康状况 - 容器在无错的条件下运行
    3. 服务发现 - 容器在哪,怎样与它通信
    4. 监控 - 容器是否运行正常
    5. 认证 - 谁能访问容器
    6. 容器聚合 - 如何将多个容器合并成一个工程

    Kubernetes组件组成:

    1. kubectl
      客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。
    2. kube-apiserver
      作为整个系统的控制入口,以REST API服务提供接口。
    3. kube-controller-manager
      用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
    4. kube-scheduler
      负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。
    5. etcd
      负责节点间的服务发现和配置共享。
    6. kube-proxy
      运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。
    7. kubelet
      运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
    8. DNS
      一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

    2. 环境搭建

    2.1 安装

    centos系统下的yum 安装:

    首先要关闭防火墙

    systemctl stop firewalld
    

    如果服务器已安装过docker, 请先卸载

    yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-selinux \
                      docker-engine-selinux \
                      docker-engine
    

    master

    yum install -y etcd kubernetes
    

    2.2. 配置

    docker配置
    编辑/etc/sysconfig/docker文件。修改OPTIONS

    
    

    kube-apiserver配置
    编辑/etc/kubernetes/apiserver文件,把--admission_control中的参数ServiceAccount删除。

    2.3. 启动

    依次执行以下命令启动服务

    systemctl start etcd
    systemctl start docker
    systemctl start kube-apiserver
    systemctl start kube-controller-manager
    systemctl start kube-scheduler
    systemctl start kubelet
    systemctl start kube-proxy
    

    至此,我们的环境以及安装好了

    3. 简单的例子

    通过上述步骤,实际上我们已经搭建了一个单节点的集群,下面将介绍一个简单的Mysql的部署的例子。

    3.1. RC创建

    创建mysql-rc.yaml文件,并根据需求填写以下内容:

    apiVersion: v1
    kind: ReplicationController         #副本控制器RC
    metadata:
      name: mysql                             #RC的名称,全局唯一
    spec:
      replicas: 1                                 #Pod副本的期待数量
      selector:
        app: mysql                               #符合目标的Pod拥有此标签
      template:                                  #根据此模板创建Pod的副本(实例)
        metadata:
          labels:
            app: mysql                          #Pod副本拥有的标签,对应RC的Selector
        spec:
          containers:                            #Pod内容器的定义部分
          - name: mysql                       #容器的名称
            image: 192.168.77.53:5000/mysql:5.7.20   #容器对应的Docker image
            ports:
            - containerPort: 3306           #容器应用监听的端口号
            env:                                    #注入容器内的环境变量
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
    

    yaml定义文件中的kind属性,用来表示此资源对象的类型,比如这里的值为ReplicationController,表示这是一个RC;spec一节中是RC的相关属性定义,比如spec.selector是RC的Pod标签(label)选择器,即监控和管理拥有这些标签的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里我们设置replicas=1表示只运行一个MySQL Pod实例。当集群中运行的Pod实例数量小于replicas时,RC会根据spec.template一节中定义的Pod模板来生成一个新的Pod实例,spec.template.metadata.labels指定了改Pod的标签,需要特别注意的是:这里的labels必须匹配之前的spec.selector,否则此RC每次创建了一个无法匹配Label的Pod,就会不停的尝试创建新的Pod,最终陷入“只为他人做嫁衣”的悲惨世界中。

    编辑好mysql-rc.yaml文件之后,为了将它发布到Kubernetes集群中,我们在Master节点中该文件目录下执行以下命令:

    kubectl create -f mysql-rc.yaml
    
    create

    成功之后可以执行以下命令查看结果:

    kubectl get rc
    kubectl get pods
    
    get rc
    get pods

    3.2. Service创建

    上一步已经完成了pod和ReplicationController的创建,这里将创建一个对外的服务。
    新建mysql-svc.yaml文件,并写入以下内容:

    apiVersion: v1
    kind: Service                   #表明是kubernetes service
    metadata:
      name: mysql                 #服务名称,全局唯一
    spec:
      type: NodePort             #指定类型为node port
      ports:
      - port: 3306                  #虚拟端口号
        nodePort: 30001         #节点端口号
      selector:
        app: mysql                 #标签选择
    

    其中,metadata.name是服务名称,port属性则定义了服务的虚拟端口,spec.selector确定了哪些Pod副本(实例)对应到本服务。注意type=NodePortnodePort=30001的两个属性,表明此服务开启了NodePort方式的外网访问模式,且访问端口为30001。

    之后我们同样执行以下命令,创建服务:

    kubectl create -f mysql-svc.yaml
    
    create service

    完成之后,可使用以下命令查看结果:

    kubectl get svc
    
    get svc

    这个时候,我们就可以通过外网来访问我们的数据库啦,当然端口号是30001.

    4. 问题及处理

    1. ContainerCreating
      在执行kubectl create 之后,执行kubectl get pods, 发现pod的状态一直是ContainerCreating。
      err
      执行kubectl describe pod podname可查看错误信息
      info
      这个时候,我们发现缺少/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt文件。于是就进这个目录看看是不是真的没有。
      err
      发现这个文件还真是存在的。那为什么会说不存在呢。换个命令试下
      err
      这个文件会指向另外一个文件。我这里再次查找之后,发现/etc/rhsm/ca/redhat-uep.pem文件确实不存在。网上搜了一下。说是安装rhsm可以解决。于是执行以下命令:
    yum install -y *rhsm*
    

    安装好之后,/etc/rhsm/ca/目录下还是空的。还是没有解决问题,依然报之前的错。
    换种思路吧。既然pull不到这个镜像,我们就手动执行以下命令用另外一个镜像来代替它:

    docker pull docker.io/kubernetes/pause
    

    然后修改配置文件/etc/kubernetes/kubelet,将KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest""改成KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/kubernetes/pause:3.0"。再重启kubelet即可。

    sucess

    5. 完

    转载请注明出处
    kubernetes(k8s) 介绍及简单例子

    相关文章

      网友评论

        本文标题:kubernetes(k8s) 介绍及简单例子

        本文链接:https://www.haomeiwen.com/subject/wfnyjftx.html