在前面的文章中已经部署好k8s的高可用环境了,这篇文章就在前面文章的基础上操作了。这里我们就部署3个Nginx服务的pod,我们是可以通过命令行和编辑yaml文件来创建的,不过我们一般都会写一个yaml文件来创建。
1、YAML基础
yaml文件是专门用来写配置文件的语言,非常简洁和强大,使用的话比json会更方便点,其实实际上是一种通用的数据串行的格式。 yaml文件的语法规则:
大小写敏感
使用缩进表示层级关系
缩进不允许使用tab,只允许空格
缩进的空格数不重要,只要相同层级的元素左对齐即可
'#'表示注释,从这个字符一直到行尾,都会被解析器忽略
说明:
- 定义配置时,指定最新稳定版API
- 配置文件应该存储在集群之外的版本控制仓库中。如果需要,可以快速回滚配置、重新创建和恢复
- 应该使用YAML格式编写配置文件,而不是json。YAML对用户更加友好
- 可以将相关对象组合成单个文件,通常会更容易管理
- 不要没必要指定默认值,简单和最小配置减小错误
- 在注释中说明一个对象描述更好维护
2、创建YAML文件
2.1、YAML文件内容
这里我就现在创建一个单独的namespace,编辑一个yaml文件创建Deployment和Service,这两个也是可以单独执行,放在一个yaml文件中的话是需要使用连续的三个短横线隔开,内容如下:
root@k8s-master1:/data/k8s-yaml# vim zg-test-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: zg-test
root@k8s-master1:/data/k8s-yaml# vim nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: zg-test
name: nginx-test-deoloyment
labels:
app: nginx-test
spec:
replicas: 3
selector:
matchLabels:
app: nginx-test
template:
metadata:
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx:1.18.0
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: test-nginx-service-label
name: test-nginx-service
namespace: zg-test
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30004
selector:
app: nginx-test
2.2、YAML文件的简要说明
2.2.1、Deployment
在一个完整的Deployment中是需要包含matedata(元数据)、spec(期望状态)和status(状态)三部分,status是需要创建Deployment完后才会显示的,会有running的状态,也会有其他的异常状态。
apiVersion:指的是创建对象所使用的API版本,此值必须在kubectl apiversion中。
kind:需指定副本控制器,副本控制器发展到目前共有三代,依次为Replication Controller、ReplicaSet和Deployment。
metadata: Deployment的元数据,帮助识别对象唯一性的数据,包含名称和标签,也可以加上名称空间等信息。 1、namespace:指定名称空间 2、name:指定版本控制器名称 3、labels:定义资源的标签
spec:相当于Deployment的规范,是Deployment创建pod的期待状态,用于定义Deployment中容器的详细信息。 1、replicas:副本数量,即创建几个pod,创建多个pod时,极大概率会分布在不同的node节点上,很少出现偏向同一节点的情况; 2、selector:定义标签选择器,通过匹配label来告诉控制器去管理哪些副本,使pod维持在期望状态; ① matchLabels:定义匹配的标签,必须要设置; ② app: nginx:匹配的目标标签; 3、template:模板,必须要设置,用于定义期望状态下的pod相关信息。 ① metadata:定义模板元数据; ② labels:定义模板标签; ③ app: 模板标签名称; ④ spec:定义pod相关信息; ⑥ containers:定义pod中的容器数量,可以为1个或者多个,pod不能动态增减容器数量; ⑦ - name:容器名称; ⑧ image:容器使用的镜像; ⑨ ports:容器端口列表; ⑩ - containerPort:pod容器使用的端口。
2.2.2、SVC
格式基本上差不多,不过在SVC中可以看对应的labels来做匹配。
apiVersion:指定需要使用的API版本,是需要此值必须在kubectl apiversion中。
kind:选择创建资源的角色/类型。
matedata:定义资源的元数据/属性; 1、lables:定义资源的标签; 2、name:定义service的名称,该名称可以被DNS解析; 3、namespace:定义service的命令空间。
spec:定义容器中的详细信息 1、type:定义服务的访问方式,默认是ClusterIP,这样的话就只能在k8s集群内部访问; 2、ports:定义访问端口列表; ① - name:定义端口的端口的名称; ② port:定义service监听的端口; ③ protocol:service服务进行转发时使用的协议,这里是支持tcp、udp和stcp三种协议的; ④ targetPort:设置目标容器的端口; ⑤ nodePort:在宿主机上打开的端口号,如果type使用的ClusterIP,就可以不需要添加此配置。
selector:这个是service的效验器或标签选择器,这个是要匹配访问到目标的pod,这里的值是需要和Deployment.spec.selector.mathLabels的值相对应的。
3、使用YAML文件创建namespace、Deployment和SVC
编辑好的yaml文件是需要使用kubectl apply命令来创建的,这里的镜像我就使用官方的nginx镜像了,在生产环境的话都是打好自己的镜像来创建容器的,创建完后等一会就可以看deployment的状态了,没出问题的话就会三个pod的状态都是ready的,可以查看pod信息时,会发现通过deployment创建的三个nginx pod已经正常运行了。
4、修改nginx的默认页面并访问测试
在前面我们已经创建好了nginx的容器,现在是可以通过浏览器访问任意一个节点的IP加上30004端口去访问页面,我们可以去容器中修改一下页面显示各自宿主机的IP,在生产中我们都是在打好的镜像中就和代码结合了,就可以不用去容器修改啥了;这里修改默认的主要的话是也可以进入到容器,我们可以使用kubectl exec命令在加上pod的名称进行登陆到容器,我们之前部署了一个dashboard,也是可以在dashboard页面上修改。
修改默认页面后,再次访问主页
5、高可用代理配置
在生产中的话都是通过代理的来访问web服务的,可以在HAProxy服务器中进行转发设置,将三个node节点的信息添加进去,即可通过VIP地址进行访问。
root@ha1:~# vim /etc/haproxy/haproxy.cfg #在配置文件最后加上下面内容,配置完后再重启一下haproxy服务
listen kubernetes-nginx-80
bind 10.0.0.200:80
mode tcp
balance roundrobin
server node1 10.0.0.106:30004 check inter 3s fall 3 rise 5
server node2 10.0.0.107:30004 check inter 3s fall 3 rise 5
server node3 10.0.0.108:30004 check inter 3s fall 3 rise 5
root@ha1:~# systemctl restart haproxy.service