Kubernetes 第1章 Kuberntes入门

1.1 Kubernetes是什么

首先,它是一个全新的基于容器技术的分布式架构领先方案。

其次,如果我们的系统设计遵循了Kubernetes的设计思想,那么传统系统架构中那些和业务没有多大关系的底层代码或功能模块,都可以立刻从我们的视线中消失,我们不必再费心于负载均衡的选型和部署实施问题,不必再考虑引入或自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发。部之使用Kubernetes提供的解决方案,我们不仅节省了不少于30%的开发成本,同时可以将精力更加集中于业务本身,而且由于Kubernetes提供了强大的自动化机制,所以系统后期的运维难度和运维成本大幅度降低。

1.2 为什么要用Kubernetes

首先,最直接的感受是我们可以“轻装上阵”地开发复杂系统了。

其次,使用Kubernetes就是在全面拥抱微服务架构。

然后,我们的系统可以随时随地整体“搬迁”到公有云上。

1.2 从一个简单的例子开始

Java Web App 

此java web应用结构比较简,是一个运行在Tomcat里的Web APP,如图1.1所示,JSP页面通过JDBC直接访问MYAQL数据库并展示数据。为了演示和简化目的,只要程序正确连接到了数据上,它就会自动完成对应的Table的创建与初始化数据的准备工作。所以当月我们通过浏览器访问此应用的时候,就会显示一个表格的页面,数据则来自数据库。


此应用需要启动两个容器: Web App容器和MySQL容器,并且Web APP容器需要访问MySql容器。在Docker 时代,假设我们在一个宿主主机上启动了这两个容器,则我们需要把MySQL容器IP地址通过环境变量的方式注入到WebAPP容器里:同是,需要将WebApp容器的8080端口映射到主机的8080端口,以便能在外部访问。本章的这个例子里,我们看看中Kubernetes时代是如何完成这个目标的。

1.3.1 环境准备

首先,我们开始准备Kubernetes的安装和相关镜像下载,本书建议采用VirtualBox或者VMware Workstation在本机虚拟一个Centos7虚拟机作为学习环境,,虚拟机采用NAT的网络模式以便能名连接外网,然后按照以下步骤快速安装Kubernetes。

(1)关闭CentOS自带的防火墙服务:

[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# systemctl stop firewalld

(2)安装etcd和Kubernetes软件(会自动安装Docker软件):

yum install -y etcd kubernetes

(3)安装好软件后,修改两个配置文件(其他配置文件使用系统默认的配置参数即可)。

    a,etc/kubernetes/kubelet修改KUBELET_POD_INFRA_CONTAINER选项"

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/acs/pause-amd64:3.0"

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

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

c,/etc/sysconfig/docker文件

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'

按顺序启动所有的服务:

[root@localhost ~]# systemctl start etcd
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl start kube-apiserver
[root@localhost ~]# systemctl start kube-controller-manager
[root@localhost ~]# systemctl start kube-scheduler
[root@localhost ~]# systemctl start kubelet
[root@localhost ~]# systemctl start kube-proxy

至此,一个单机版的Kubernetes集群环境就安装启动完成了。

接下来,我们可以在这个单机版的Kubernetes集群上手练习了。

注:本书示例中的Docker镜像下载地址为https://hub.docker.com/u/kubeguide/。

1.3.2 启动MySQL服务

首先为MySQL服务创建一个RC定义文件:mysql-rc.aml,下面给出了该文件的完整内容和解释,

[root@localhost ~]# cat mysql-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

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

创建好redis-master-controller.yaml文件后,为了将它发布到kubernetes集群中,我们在Master节点执行命令:

[root@localhost ~]# kubectl create -f mysql-rc.yaml 
replicationcontroller "mysql" created

接下来,我们用kuberctl命令查看刚刚创建的RC:

[root@localhost ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         56m

查看Pod的创建情况时,可以运行下面的命令:

[root@localhost ~]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
mysql-t01pb   1/1       Running   0          57m

我们看到一个名为mysql-xxxxx的Pod实例,这是Kubernetes根据mysql这个RC的定义自动创建的Pod。由于Pod的调度和创建需要药费一定的时间,比如需要一定的时间来确定调度到哪个节点上,以及下载Pod里容器的镜像需要一段时间,所以一开始我们看到Pod的状态将显示为Pending.当Pod成功创建完成后,状态最终会显示被更新为Running。

mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
     app: mysql

运行kubectl命令,创建service:

 #kubectl create -f mysql-svc.yaml

查看看到刚刚创建的serivce:

NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          179d
mysql        10.254.33.142    <none>        3306/TCP         54m
[root@localhost ~]# 


1.3.3 启动Tomcat应用

上面我们定义和启动了MySQL服务,接下来我们采用同样的步骤,完成Tomcat应用的启动过程。首先,创建对应的RC文件myweb-rc.yaml,内容如下:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 1
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
        - name: myweb
          image: kubeguide/tomcat-app:v1
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

注意到上面RC对应的Tomcat容器里引用了MYSQL_SERVICE_HOST=mysql这个环境变量,而"mysql"恰好是我们之前定义的MySQL服务名,运行下面的命令,完成RC的创建和验证工作:

最后,创建对应的Serivce.以下是完整的yaml定义文件(myweb-svc.yaml):

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
   - port: 8080
     nodePort: 30001
  selector:
    app: myweb

注意 type=NodePory和nodePort=30001 的两个属性,表明此Serivce开启了NodePort方式的外网访问模式,在Kubernetes集群之外,比如在本机的浏览器里,可以通过30001这个端口访问myweb(对应到8080的虚拟端口上)。

运行kubectl create命令进行创建:

[root@localhost ~]# kubectl create -f myweb-svc.yaml

运行kubectl命令,查看创建的Service:

[root@localhost ~]# kubectl get services
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          179d
mysql        10.254.33.142    <none>        3306/TCP         49m
myweb        10.254.195.134   <nodes>       8080:30001/TCP   8m

至此,我们的第1个Kubernetes例子搭建完成了。

猜你喜欢

转载自blog.csdn.net/tjjingpan/article/details/80414397