k8s基本概念及入门案例

回复 收藏

由于公司服务器上全部由 docker+k8s 搭建,所以,入职后就只是在学习,docker+k8s,docker铭哥那里有视频可以参考,关于k8s 根据书籍和网络简单整理了以下笔记。

1. Kubernetes介绍

基本概念和术语

- Node

Node(节点),是k8s集群中相对于master而言的工作主机(物理机或虚拟机),在每个Node上运行 用于启动和管理pod的服务(kubelet),并能够被maste管理。

在Node上运行的服务进程有kubelet,kube-proxy,docker daemon。

- Pod

Pod是Kubernetes的基本操作单元,把相关的一个或多个容器构成一个Pod,通常Pod里的容器运行相同的应用。Pod包含的容器运行在同一个Node(Host)上,看作一个统一管理单元,共享相同的volumes和network namespace/IP和Port空间。

- Replication Controller

Replication Controller确保任何时候Kubernetes集群中有指定数量的pod副本(replicas)在运行, 如果少于指定数量的pod副本(replicas),Replication Controller会启动新的Container,反之会杀死多余的以保证数量不变。

Replication Controller使用预先定义的pod模板创建pods,一旦创建成功,pod 模板和创建的pods没有任何关联,可以修改pod 模板而不会对已创建pods有任何影响,也可以直接更新通过Replication Controller创建的pods。对于利用pod 模板创建的pods,Replication Controller根据label selector来关联,通过修改pods的label可以删除对应的pods。

在运行时可以通过修改RC的副本数量,来实现Pod的动态缩放,k8s提供了kubectl scale命令一键完成

kubectl scale rc redis-slave --relicas=3

scaled

注意:删除RC并不会影响通过该RC创建的Pod,为了删除所有Pod,可以设置replicas为0,然后更新 RC, 另外,客户端工具kubectl 提供了stop 和delete命令来完成一次性删除RC和RC控制的Pod。

- Service

Service也是Kubernetes的基本操作单元,是真实应用服务的抽象,每一个服务后面都有很多对应的容器来支持 和服务selector决定服务请求传递给后端提供服务的容器,对外表现为一个单一访问接口,外部不需要了解后端如何运行,这给扩展或维护后端带来很大的好处。

一个service可以看作 一组提供相同服务的Pod 的对外接口。sevice作用于哪些Pod是通过Label Selector来定义的。 

- Label

Label是用于区分Pod、Service、Replication Controller的key/value键值对,Pod、Service、 Replication Controller可以有多个label,但是每个label的key只能对应一个value。Labels是Service和Replication Controller运行的基础,为了将访问Service的请求转发给后端提供服务的多个容器,正是通过标识容器的labels来选择正确的容器。同样,Replication Controller也使用labels来管理通过pod 模板创建的一组容器,这样Replication Controller可以更加容易,方便地管理多个容器,无论有多少容器。

- Volume 

存储卷的pod中能够被多个容器访问的共享目录。其与Pod的生命周期相同,与容器的生命周期无关。

k8s支持多种类型的volume,并且一个pod可以同时使用任意多个volume。

- Namespace

命名空间,用来组织k8s的各种对象,可以实现对用户的分组和管理,对不同的租户(pod rc service)还可以进行单独的资源配额设置和管理。

等。

Kubernets属于主从的分布式集群架构,包含Master和Node:

1. Master作为控制节点,调度管理整个系统,包含以下组件:

- etcd 是高可用的key/value存储系统,用于持久化存储集群中所有资源对象,

- API Server作为kubernetes系统的入口,封装了核心对象的增删改查操作,以REST Ful接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到etcd(一个分布式强一致性的key/value存储)。

 

- Scheduler:负责集群的资源调度,负载pod在集群节点中的调度分配,新建的pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。

- Controller Manager:负责执行各种控制器,目前有两类:

(1)Endpoint Controller:定期关联service和pod(关联信息由endpoint对象维护),保证service到pod的映射总是最新的。

(2)Replication Controller:定期关联replicationController和pod,保证replicationController定义的复制数量与实际运行pod的数量总是一致的。

2,Node是运行节点,运行业务容器,包含以下组件:

    - Kubelet:责管控docker容器,如启动/停止、监控运行状态等。它会定期从etcd获取分配到本机的pod,并根据pod信息启动或停止相应的容器。同时,它也会接收apiserver的HTTP请求,汇报pod的运行状态。

    - Kube Proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。当某个客户pod要访问其他pod时,访问请求会经过本机proxy做转发。

   - Kubernets使用Etcd作为存储和通信中间件,实现Master和Node的一致性,这是目前比较常见的做法,典型的SOA架构,解耦Master和Node。

Kubernetes里各个服务(组件)的作用以及它们之间的交互关系。

wKioL1RYg8KDjPcWAADrQAXqHYo886.jpg

Kubernetes里各个服务(组件)的作用以及它们之间的交互关系。  

QQ截图20170417132455.png

k8s 入门案例:搭建 Hello World 网页。

参考yaml。

https://segmentfault.com/a/1190000004861499

环境:centos7 ,

案例:搭建 Hello World 网页。

1,关闭防火墙

 systemctl disable firewalld

 systemctl stop firewalld

2,安装ectd和kubernetes,会自动安装docker

yum install -y etcd kubernetes

修改配置文件

修改daocker

vi /etc/sysconfig/docker

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

修改kuberbetets apiservice 

vi /etc/kubernetes/apiserver

把KUBE_ADMISSION_CONTROL="--admission-control=……参数中的ServiceAccount 删除。

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

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

4,下载镜像

需要下载3个镜像,redis-master ,  guestbook-redis-slave,  guestbook-php-frontend,

docker pull kubeguide/redis-master

docker pull kubeguide/guestbook-rediis-slave

docker pull kubeguide/guestbook-php-frontend

此图采用k8s部署架构,master 与 node的服务处于同一个虚拟机,通过创建 redis-master服务,redis-slave服务,和php-frontend服务(php前端),完成这个例子。

2732761611-56ff8ab706384.png

5,创建redis-master Pod 和 服务。

方法:先定义RC来创建Pod,然后定义与之相关联的Service。

(1)首先为 redis-master 服务创建一个名为redis-master的RC定义文件:

vi redis-master-controller.yaml

内容如下

apiVersion: v1

kind: ReplicationController

metadata:  

  name: redis-master

spec:

  replicas: 1

  selector:

    name: redis-master

  template:

     metadata:

          name: redis-master

          labels:

             name: redis-master

     spec:

        containers:

        - name: redis-master

           image: kubeguide/redis-master

           ports:

           - containerPort: 6379

解析:

kind: ReplicationController     ##表示这是一个RC ,   

spec:

  replicas: 1

  selector:    ## slaector是RC的Pod选择器,即监视和管理拥有这些标签(Lable)的Pod实例,确保当前集群上始终有且仅有replicas个Pod实例在运行,这里设置为  replicas: 1 ,表示只能运行1个(名为redis-master 的)Pod实例,当集群中运行的Pod实例小于replicas时,RC会根据 spec:  下 template: 段定义的Pod模版来生成一个新的Pod实例,lables属性指定了该Pod的标签,注意:这里的lables必须匹配RC的 spec:selector:    

基本概念:

http://www.mamicode.com/info-detail-590007.html

pod

- 基本部署单元,可以进行创建,调度,管理,删除等

- 包含一个或者多个docker container,基于数据卷进行数据共享

- 用于推动相同功能集合的程序集中部署

- 示例:web站点三个组件(前端、后端、数据库)运行在各自的容器中,可以创建包含三个container的pod

Replication controllers

- pod生命周期控制器

- 负责pod的动态扩容,缩容,保证pod的数量符合预期

label

- key/value 键值对(基于etcd)

- 用于存储pod的tag标签,用于关联service和pod,replication controller和pod的关系

- 提供laber selector供外部调用,获取索引对应的value

参考资料:

http://blog.csdn.net/yjk13703623757/article/details/53746273

http://cizixs.com/2016/10/25/kubernetes-intro-kubelet

创建好redis-master-controller.yaml后,在master节点执行命令:kubectl create -f <config_file>,

将它发布到k8s集群中,就完成了redis-master的创建过程,

kubectl create -f redis-master-controller.yaml

提示: replicationcontrollers "redis-master" created     表示创建成功。

查看:

# kubectl get rc

NAME           DESIRED   CURRENT   READY     AGE

redis-master   1                 1                1         2m

kubectl get pods,来查看当前系统中的Pod信息,redis-master-03fv1 这是kubernetes根据redis-master这个RC的定义自动创建的Pod,Runing,表示在运行。

# kubectl get pods

NAME                 READY     STATUS    RESTARTS   AGE

redis-master-03fv1   1/1       Running   0          3m

(2)接下来创建一个与之关联的Service(服务)—— redis-master的定义文件,文件名为

vi redis-master-service.yaml 

内容如下:

apiVersion: v1

kind: Service

metadata:

    name: redis-master     (服务名)

    labels:

       name: redis-master

   spec:

      ports:

      - port: 6379

         targetPort: 6379

     selector:

         name: redis-master ( 表示拥有redis-master标签的Pod)

解析:

metadata.name 是Service的服务名(ServiceName),spec.selector确定了哪些Pod对应到本服务,这里的定义表明拥有redis-master标签的Pod属于redis-master服务。另外,ports部分中的targetPort属性用来确定提供该服务的容器所暴露(EXPOSE)的端口号,即具体的服务进程在容器内的targetPort上提供服务,而port属性则定义了Service的虚端口。

在pod启动后,系统会根据service的定义创建出与pod对应的Endpoint,以建立起service与后端pod的对应关系,。

查看 pod的 ip+port

kubectl get endpoints

NAME           ENDPOINTS                                            AGE

frontend       192.168.1.128:80,192.168.1.129:80,192.168.1.130:80   2d

kubernetes     192.168.1.183:6443                                   4d

redis-master   192.168.1.131:6379                                   3d

redis-slave    192.168.1.132:6379,192.168.1.133:6379                3d

pod的ip是Docker Daemon 根据docker0网桥的ip地址进行分配的,

运行Kubectl , 创建service。

[root@localhost ~]# kubectl create -f redis-master-service.yaml

service "redis-master" created

[root@localhost ~]# kubectl get service

NAME           CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE

kubernetes     10.254.0.1     <none>        443/TCP    23h

redis-master   10.254.82.44   <none>        6379/TCP   40s  

此时,redis-master服务,被分配了一个值为10.254.208.57的ip地址(虚拟ip),随后,kubeenetes集群中其他新创建的Pod就可以通过这个虚拟IP地址+端口 6379来访问他了。(kubernetes 使用了linux的环境变量,在每个Pod的容器里奋都增加了一组Service相关的环境变量,用来记录从服务名到虚拟IP地址的映射关系。)

(3),创建redis-slave-Pod和服务。

将会启动redis-slave服务的两个副本,每个副本上的Redis进程都与redis-master所对应的redis进程进行数据同步,3个Redis实例组成一个具备读写分离功能的Redis 集群。 留言板PHP程序通过redis-slave服务来获取已保存的留言数据。

创建一个名为 redis-slave-controller.yaml的RC文件,

内容如下:

apiVersion: v1kind: ReplicationControllermetadata:  name: redis-slavespec:  replicas: 2  selector:    name: redis-slave  template:    metadata:      name: redis-slave      labels:        name: redis-slave    spec:      containers:      - name: redis-slave        image: kubeguide/guestbook-redis-slave        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 6379

运行kubectl create命令

[root@localhost ~]# kubectl create -f redis-slave-controller.yaml

replicationcontroller "redis-slave" created

[root@localhost ~]# kubectl get rc

NAME           DESIRED   CURRENT   READY     AGE

redis-master   1         1         1         16h

redis-slave    2         2         2         1m

[root@localhost ~]# kubectl get pods

NAME                 READY     STATUS    RESTARTS   AGE

redis-master-03fv1   1/1       Running   0          16h

redis-slave-0wfnk    1/1       Running   0          1m

redis-slave-w8t4z    1/1       Running   0          1m

此时运行了两个redis-slave Pod

为了实现Redis集群的主从数据同步,redis-slave需要知道redis-master的地址,所以在redis-slave镜像的启动命令 /run.sh中,可以输入下面内容:

redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379

创建redis-slave服务,

vi  redis-slave-service.yaml

apiVersion: v1

kind: Service

metadata:

  name: redis-slave

  labels:

    name: redis-slave

spec:

  ports:

  - port: 6379

  selector:

    name: redis-slave

运行:

[root@localhost ~]# kubectl create -f redis-slave-service.yaml

service "redis-slave" created

[root@localhost ~]# kubectl get service

NAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE

kubernetes     10.254.0.1       <none>        443/TCP    10m

redis-master   10.254.64.116    <none>        6379/TCP   2m

redis-slave    10.254.135.254   <none>        6379/TCP   33s

(4),创建frontend Pod 和服务

先定义frontened的RC配置文件,

vi frontend-controller.yaml

apiVersion: v1kind: ReplicationControllermetadata:  name: frontend  labels:    name: frontendspec:  replicas: 3  selector:    name: frontend  template:    metadata:      labels:        name: frontend    spec:      containers:      - name: frontend        image: kubeguide/guestbook-php-frontend        env:        - name: GET_HOSTS_FROM          value: env        ports:        - containerPort: 80

kubectl create -f frontend-controller.yaml

replicationcontroller "frontend" created

[root@localhost ~]# kubectl get rc

NAME           DESIRED   CURRENT   READY     AGE

frontend       3         3         0         11s

redis-master   1         1         1         16h

redis-slave    2         2         2         49m

[root@localhost ~]# kubectl get pods

NAME                 READY     STATUS    RESTARTS   AGE

frontend-fs42h       1/1       Running   0          1m

frontend-mhxjr       1/1       Running   0          1m

frontend-r6p75       1/1       Running   0          1m

redis-master-03fv1   1/1       Running   0          16h

redis-slave-0wfnk    1/1       Running   0          50m

redis-slave-w8t4z    1/1       Running   0          50m

最后创建frontend Service ,主要目的是使用Service的NodePort给kubernetes集群中Service映射一个外网可以访问的端口,这样一来,外部就可以通过 NodeIP+NodePort的方式访问集群中的服务了。

vi frontend-service.yaml

内容如下:

apiVersion: v1kind: Servicemetadata:  name: frontend  labels:    name: frontendspec:  type: NodePort  ports:  - port: 80    nodePort: 30001  selector:

    name: frontend

关键点是设置type=N0dePort 并指定一个NodePort的值,表示使用NODE上的物理机端口提供对外访问的能力。

soec.port.NodePort的端口号定义范围有限制,默认为是30000~32767 , 其他则失效。

创建service

[root@localhost ~]# kubectl create -f frontend-service.yaml

service "frontend" created

[root@localhost ~]# kubectl get service

NAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

frontend       10.254.124.248   <nodes>       80:30001/TCP   28s

kubernetes     10.254.0.1       <none>        443/TCP        1d

redis-master   10.254.82.44     <none>        6379/TCP       1h

redis-slave    10.254.157.219   <none>        6379/TCP       18m

[root@localhost ~]# kubectl get pods

NAME                 READY     STATUS    RESTARTS   AGE

frontend-fs42h       1/1       Running   2          5h

frontend-mhxjr       1/1       Running   2          5h

frontend-r6p75       1/1       Running   2          5h

redis-master-03fv1   1/1       Running   2          21h

redis-slave-0wfnk    1/1       Running   2          5h

redis-slave-w8t4z    1/1       Running   2          5h

此时所有的pod都处于 Runing状态,表示成功创建成功。

6,浏览器访问网页

ip:30001

Image.png参考:

1,Kubernetes技术分析之入门

http://www.tuicool.com/articles/Ine2YrI

2,Kubernetes 从入门到进阶 第一个Helloworld程序

http://blog.csdn.net/liumiaocn/article/details/52366063

2017-04-17 13:27 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: