天天看点

创建svc来访问deployment部署的pod

  在前面的文章中已经部署好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已经正常运行了。

创建svc来访问deployment部署的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
           

继续阅读