手记

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         #副本控制器RCmetadata:
  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 servicemetadata:
  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) 介绍及简单例子



作者:ChainZhang
链接:https://www.jianshu.com/p/924bce1c6015


0人推荐
随时随地看视频
慕课网APP