在前面的文章中已经部署好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的默认页面并访问测试
5、高可用代理配置
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