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