您的位置:首页 > 其它

K8S基本概念视频教学学习笔记

2017-09-25 13:13 471 查看
K8S基本概念-视频教学-学习笔记
 

 

Rancher官方免费培训视频网址:

视频网址:http://v.youku.com/v_show/id_XMjg5MTM5MjMxNg


视频时长:56分钟

 

目录:

1、配置Rancher和Kubernetes

2、K8S CLI: kubectl使用

3、容器组Pods

4、部署应用Deplotments

5、服务Services

6、配置管理Configmaps

7、负载均衡Ingresses

 

1、配置Rancher和Kubernetes

 

官方文档地址:http://rancher.com/docs/rancher/v1.6/en/kubernetes/

 

K8S电子书:概念介绍、部署扩容、升级监控等

http://info.rancher.com/deploying-scaling-kubernetes-ebook

 

3、容器组Pods

K8S的Pod概念:

 

-最小的调度单位

-包含一个或多个container

-每个pod有一个唯一的IP地址(不是每个容器有一个唯一的IP地址,Rancher中每个容器有一个IP地址)

-一个Pod中的容器可以通过localhost相互通信(一个Pod中的多个容器共享网络、IPC等命名空间)

-Pod中通常只有一个容器

-一般情况下,可以把Pod等同于Container

 

2、K8S CLI: kubectl

 

kubectl get node  #获取节点信息

helm version   #查看helm工具版本,部署较麻烦

 

在Rancher的K8S CLI页面中,

会自动生成kubectl命令行连接配置文件,

可以复制,也可以下载,无需我们编辑,

将K8S的kubectl配置文件的信息存放到:~/.kube/config,

这样就可以在shell中使用kubectl命令行工具连接到K8S。

 

可以通过复制,然后vi工具中粘贴

vi ~/.kube/config

这样在安装kubectl命令行工具的机器上,

就可以去连接到和管理K8S集群了,

这是Rancher带来的方便之处。

 

如何使用kubectl命令行创建一个Pod?

先用vi工具,编辑一个yaml文件,文件名随意,文件内容需要参考资料。

 

#编辑一个shell-pod.yaml文件

vim shell-pod.yaml

 

#使用刚刚创建的yaml文件,创建一个pod,-f参数指定一个文件

kubectl create -f shell-pod.yaml  

 

#查看是否已经创建了一个新的Pod,获得Pod状态

kubectl get pod   

 

#进入到shell容器中,执行bash命令

kubectl exec -it shell bash   

 

#编辑一个nginx Pod的yaml文件

vim nginx-pod.yaml  

 

#根据nginx-pod.yaml文件的内容,创建一个nginx pod。

kubectl create -f nginx-pod.yaml    

 

在K8S集群的不同Pod的IP地址是相同网段的,他们之间是可以相互访问的。

 

#访问容器IP的80端口,看是否有输出

curl 10.42.x.x

 

#查看nginx pod
的详细详细,非常详细!

kubectl describe pod nginx   

 

#编辑一个复杂的Pod配置文件,

#包括版本、类型、名字,镜像、端口、环境变量、数据卷、网络等

vim full-pod.yaml  

 

full.pod.yaml文件内容:

 

apiVersion: v1

kind:Pod

metadata:

  name:full

spec:

  containers:

  - name:full

    image:nginx

    ports:

      - containerPort:80

    env:

      - name:EXAMPLE_ENV_VARIABLE

        value:example_value

    volumemounts:

      -mountPath:/container-dir

       name:example-volume

  volumes:

    - name:example-volume

      hostPath:

         path:/host-dir

  nodeSelector:

      disktype:ssd

  hostNetwork:true

 

以上配置文件与docker-compose.yml非常类似

 

 

4、部署应用Deplotments

 

Deployments:(部署应用)

- Pods之上的一层抽象

- 定义一组Pods期望的数量和状态

- 通常不直接运行Pods,而是使用Deployments

  (在Docker中,通常不直接使用容器,而是使用服务)

  (一个服务包含多个容器,可以动态扩充和收缩资源)

  (K8S也是一样的,Deployments对应Service)

- 一台机器宕机,其上的Pod也消失,该Pod不会自动在其他机器上启动。

- Deployments就可以处理这样的情况,规定3个Pods,发现有一个失效,会自动再启动一个Pod

 

 

vim nginx-deployment.yaml  #编辑一个deployment配置文件:

 

apiVersion:extensions/vibeta1

kind:Deployment

metadata:

  name:nginx

spec:

  replicas:3

  template:

    metadata:

      labels:

        app:nginx

    spec:

      containers:

      - name:nginx

        image:nginx:1.12

        ports:

        - containerPort:80

 

在Deployments的配置文件中,可以定义Pod的配置,包含的关系

还可以定义Pod配置文件中没有的,模板和副本数量:replicas、template,

 

#在K8S中创建nginx-deployments

kubectl create -f nginx-deployment.yaml

 

#查看deployments的信息

kubectl get deployment   

 

#删除名为nginx-1234567-xyz的Pod

kubectl delete pod nginx-1234567-xyz   

 

删除Deployments所管辖的一个Pod,会自动再创建一个Pod。

 

使用kubectl命令,更改已经存在的Deployment信息,比如扩充或减少Pod的数量

 

#将deployment/nginx的Pod数量由原来的3个调整为2个

kubectl scale deployment/nginx --replicas=2   

 

#再次查看Pod状态,可以发现已经自动少了一个nginx-1234567-xxx Pod

kubectl get pod   

 

kubectl edit deployment nginx  

#启动vi编辑器,修改deployment nginx
的配置文件,

可以将Deployments nginx中的Pods数量replicas
改为3

 

#像编辑vi一样,保存退出以后,再查看Pod数量,

发现已经自动增加运行了一个Pod

kubectl get pod

 

kubectl apply -f nginx-deployment.yaml  

#根据yaml配置文件的内容,更新Deployments,比create功能更强,

#比如修改了yaml中nginx镜像的版本到新的版本,

#使用kubectl apply -f nginx-deployment.yaml后,

#会自动删除原有的Pods,并创建新的Pods。

 

#查看某个Pod的详细信息

kubectl describe pod [nginx-pod-name]  

 

#查看某个deployment的详细定义文件,其中包含了状态,可以用来对比

kubectl get deployment nginx -o yaml   

 

 

Replication Controller & Replica Set

 

--不要为他们操心,

--交由Deployments自动创建和管理,

--之前的K8S版本使用这些功能,用于维护Pod的数量,新的版本都不用了

 

#获取 Replica Set的数量

kubectl get rs  

 

5、服务Services

 

Services

--有一个唯一的DNS名字(DNS entry)

--为一组Pods提供始终一致的端点

--功能上和Loadbalancer相似

--K8S中Pod会消亡,并且不会自动起来,通过Deployments再起来的已经不是原来的Pod,而是新的Pod,Pod的IP也会发生改变,这时候就需要一个始终一致的端点,DNS指向不同的Pod的IP地址。

--一个Service关联一组Pods,每次访问Service,会将请求发送给其中一个Pod。

 

 

vim nginx-service.yaml   

#编辑一个nginx-service.yaml文件,定义一个nginx
service,内容如下:

 

kind:Service

apiVersion:v1

metadata:

  name:nginx

spec:

  selector:

    app:nginx

  ports:

    - name:main

      protocal:TCP

      port:8080

      targetPort:80

    - name:secondary

      protocal:TCP

      port:80

      targetPort:80

 

#根据yaml文件的定义,创建一个nginx服务

kubectl create -f nginx-service.yaml

 

#查看服务(包括名称、集群IP、外部IP、端口等)

kubectl get svc   

 

再创建一个同网段的Shell容器,使用Curl工具访问域名,

curl nginx.default.svc.cluster.local:8080

curl nginx.default.svc.cluster.local:80   

#同样也可以访问,因为在yaml文件中,定义了两个端口

 

通过查看/etc/resolv.conf
域名配置文件,

我们可以看到自动包含了以下域名:

nameserver 10.43.0.x

search default.svc.cluster.local svc.cluster.local cluster.local kubelet.kubernetes.rancher.internal kubernetes.rancher.internal rancher.internal

 

因为包含以上几个搜索域,

所以可以直接使用curl nginx来替代长的域名

curl nginx

curl nginx.default.svc.cluster.local

这两种方法都可以访问相同的服务Service。

 

 

 

 

 

6、配置管理Configmaps

 

Configmaps

 

--用来做配置管理的,存储配置参数和配置文件

--可以作为环境变量暴露给Pod使用

--可以作为本地存储的方式暴露给Pod使用

 

 

vi test-cm.yaml  

#编辑一个Configmaps配置文件,内容如下:

 

apiVersion:v1

kind:ConfigMap

metadata:

  name:test-cm

data:

  key1:value1

  key2:value2

 

#根据配置文件,创建ConfigMap
配置变量。

kubectl create -f test-cm.yaml   

 

#查看configmap配置变量,只显示test-cm名字,不显示键值内容

kubectl get configmap  

 

创建好了configmap配置变量以后,我们可以在其他的pod中引用:

 

vim cm-as-env.yaml  

#再创建一个Pod,应用test-cm配置变量中的键值,文件内容:

 

apiVersion:v1

kind:Pod

metadata:

  name:env-cm-pod

spec:

  containers:

    - name:test-container

      image:ubuntu

      command:["sleep","infinity"]

      env:

        - name:PRIMARY_KEY

          valueFrom:

            configMapKeyRef:

              name:test-cm

              key:key1

        - name:SECONDARY_KEY

          valueFrom:

            configMapKeyRef:

              name:test-cm

              key:key2

 

kubectl create -f cm-as-env.yaml   

#根据上述配置内容,创建容器env-cm-pod

该pod以Ubuntu镜像为基础,启动后什么也不做,

该pod使用了两个配置变量,这两个配置变量是存储在test-cm这个ConfigMap中的。

 

#查看Pod

kubectl get pod   

 

#进入到Pod的shell中:

kubectl exec -it env-cm-pod bash

env   

#查看系统变量,可以看到这个Pod中有PRIMARY_KEY=value1这个变量以及SECONDARY_KEY=value2

 

 

另一种configmap存储配置方式:cm-as-volume

vi cm-as-volume.yaml   

#编辑一个configmap配置文件cm-as-volume.yaml

通过本地存储的方式获取configmap,内容如下:

 

apiVersion:v1

kind:Pod

metadata:

  name:volume-cm-pod

spec:

  containers:

    - name:test-container

      image:ubuntu

      command:["sleep","infinity"]

      volumeMounts:

        - name:config-volume

          mountPath:/etc/config

  volumes:

    - name:config-volume

      configMap:

        name:test-cm

 

#根据yaml文件创建volume-cm-pod

kubectl create -f cm-as-volume.yaml   

 

#查看Pod

kubectl get pod  

 

#进入到volume-cm-pod
的shell中查看

kubectl exec -it volume-cm-pod bash  

 

在容器中查看/etc/config目录

ls /etc/config   

#可以看到该目录下有key1/key2文件

 

cat /etc/config/key1  #显示key1文件的内容,即变量的值

cat /etc/config/key2  #显示key2文件的内容,即变量的值

文件名==键

文件内容=值

 

 

configmap 的作用:

多个deployments需要用到相同的一组配置参数,就不需要重复,可以利用configmap的功能来实现,减少维护的负担。

 

 

在使用Nginx镜像时,如果配置文件比较复杂,

通常把配置文件mount进容器中去。

docker run --name mynginx -p 8080:80 -v /host/path/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx

 

在K8S环境下,不能直接mount一台主机目录到容器中去,因为K8S是集群的概念,不知道容器运行在那台主机上,不能直接映射某台主机的目录到容器中。

可以把nginx的配置写到configmap中,在需要时,直接从configmap中去拿配置信息。

 

 

举例:有一个nginx的配置文件:default.conf文件,配置内容:

 

server{

    listen80;

    server_namelocalhost;

 

    location / {

        proxy_pass http://rancher.com/;
    }

 

    error_page  500 502 503 504 /50x.html;

    location * /50x.html {

        root   /usr/share/nginx/html;

    }

 

}

 

 

重要的命令:

自动的从一个配置文件创建configmap
配置文件!!!configmap的名字为proxy-cm

kubtctl create configmap proxy-cm --from-file=default.conf

 

#查看生成的yaml文件是这个样子的:

kubectl get configmap proxy-cm -o yaml

 

##**kubectl命令行中使用
-o yaml参数文件,以yaml文件的形式显示。

在这个yaml文件中,这是一个configmap yaml文件,

key是文件名

value是文件的内容

 

 

vim proxy-deployment.yaml  

#在部署文件中,引用存储在configmap中的nginx的配置文件,内容如下:

 

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

  name:proxy

spec:

  replicas:2

  template:

    metadata:

      labels:

        app:proxy

    spec:

      containers:

        - name:proxy

          image:nginx:1.12

          ports:

          - containerPort:80

          volumeMounts:

          - name:config-volume

            mountPath:/etc/nginx/conf.d/

      volumes:

        - name:config-volume

          configMap:

            name:proxy-cm

 

 

kubectl create -f proxy-deployment.yaml   

#创建一个Deployments,在其中引用configmap配置文件。

 

 

vim proxy-service.yaml  

#创建一个proxy
服务Service的yaml文件,内容:

 

kind:Service

apiVersion:v1

metadata:

  name:proxy

spec:

  selector:

    app:proxy

  ports:

    - protocal:TCP

      port:80

      targetPort:80

 

 

#创建这个proxy Service:

kubectl create -f proxy-service.yaml

 

定义的服务名称叫 proxy

 

可以在其中一个pod的shell中,使用curl访问 这个proxy:

curl proxy

 

(proxy是一个服务,会自动通过DNS进行解析,见前面的Service介绍)

这个示例proxy的作用是将所有80端口的访问都转向rancher.com

 

7、负载均衡Ingresses

 

ingresses

 

--定义K8S集群之外的网络流量如何路由到集群中的

--用来向外暴露K8S服务Service

--可以根据host,path等变量路由到内部服务。

--相当于一个7层转发。

 

在Rancher搭建的K8S环境下,

会自动创建一个ingress Controller,无需自己再搭建。

Rancher会创建一个Rancher的LB,并把ingress的配置映射到Rancher的LB上,

 

在Rancher的K8S环境的基础架构中,

会有一个kubernetes-ingress-lbs

可以将网络之外的流量导入到K8S集群的Pod内。

 

#创建一个ingress示例,内容如下:

vim ingress.yaml  

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

  name:proxy

  annotations:

    http.port:"9000"

spec:

  backend:

    serviceName:proxy

    servicePort:80

 

---

 

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

  name:nginx

  annotations:

    http.port:"9001"

spec:

  backend:

    serviceName:nginx

    servicePort:80

 

 

以上一个yaml配置文件中包含2个ingress配置,使用3个-分割!!3个-分割!!3个-分割!!

 

#根据上述yaml配置文件,创建两个ingress(一个名叫proxy、一个名叫nginx)

kubectl create -f ingress.yaml   

#查看刚才创建的ingress情况,包括名字、主机、IP地址、端口等

kubectl get ingress  

 

两个ingress将不同的外部端口访问流量,导向不同的内部服务Service。

本示例中proxy服务将流量转发到rancher.com网站,

本示例中nginx服务将流量转发到集群内的Deployments的Nginx上,

 

外部访问-->RancherLB-->ingress-->service-->deployment-->pods

RancherLB(Rancher中的应用名称为kubernetes-ingress-lbs:包含default-rancherlb-nginx、default-rancherlb-proxy,将流量分别导向K8S的两个ingress:nginx和proxy)

 

参考网站:

K8S文档:

https://kubernetes.io/docs

https://kubernetes.io/docs/resources-reference/v1.6

 

官方文档地址:

http://rancher.com/docs/rancher/v1.6/en/kubernetes/

 

K8S电子书:概念介绍、部署扩容、升级监控等

http://info.rancher.com/deploying-scaling-kubernetes-ebook

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息