005、kubernetes的附加组件
本文最后更新于 69 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

kubernetes的附加组件

一.DNS服务

1.DNS服务组件概述

K8S集群中DNS服务的作用就是将svc的名称解析成对应的VIP地址。dns组件的工作原理如下图所示。

在kubernetes早期版本中,比如k8s1.5版本中使用的是SkyDNS组件来进行解析,本案例也将采用该版本进行解析哟。但在较新的k8s版本中,CoreDNS已经替代了SkyDNS组件,由于CoreDNS组件得天独厚的优势对于SkyDNS而言简直是降维打击,感兴趣的小伙伴可以自行查阅相关资料进行对比。

在kubernetes 1.9版本中,使用kubeadm方式安装的集群可以通过命令直接安装CoreDNS。即"kubeadm init  --feature-getas=CoreDNS=true"。

从kubernetes1.12开始,CoreDNS就成为kubernetes的默认DNS服务器,但是kubeadm默认安装CoreDNS的时间更早。

推荐阅读:
    https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns

1636951975294

2.导入dns_docker镜像包

[root@k8s102.oldboyedu.com ~]# docker image load -i docker_k8s_dns.tar.gz 

温馨提示:
    如下图所示,我们导入dns的镜像包,一共会成功导入4个镜像。

image-20210721222021099

3.修改官方的skydns.yaml配置文件

[root@k8s101.oldboyedu.com /oldboyedu/dns]# vim skydns.yaml 
        ...
    spec:
      nodeName: k8s102.oldboyedu.com  # 让容器指定调度到某一个节点。
      containers:
        ...
        args:
        ...
        # 指定ApiServer的地址,请一定要指定IP地址,不要指定主机名,因为容器的"/etc/hosts"并未解析!
        - --kube-master-url=http://10.0.0.110:8080  

skydns的工作原理:
    Pod如果需要解析域名时会找DNS组件进行解析,如果DNS有记录则会直接返回给Pod相应的映射关系。如果DNS本地解析并没有记录,则DNS组件会向ApiServer发起查询请求,请求对应SVC暴露的IP地址与对应Pod的关联关系。

温馨提示:
    如下图所示,有关于"--kube-master-url"参数的值建议设置为IP地址,因为容器"hosts"是没有相关的解析!

1630325109031

4.修改官方的skydns-svc.yaml配置文件

[root@k8s101.oldboyedu.com /oldboyedu/dns]# vim skydns-svc.yaml 

...

spec:
  ...
  clusterIP: 10.254.254.254

温馨提示:
    修改SVC的IP地址本质上修改是后期暴露的DNS地址哟~

image-20210721214126800

5.运行DNS的相关Pod,观察是否调度到指定的节点

(1)创建DNS的Pod资源
[root@k8s101.oldboyedu.com /oldboyedu/dns]# ll
total 12
-rw-r--r-- 1 root root 1135 Jul 22 05:44 skydns-svc.yaml
-rw-r--r-- 1 root root 5731 Jul 22 06:01 skydns.yaml
[root@k8s101.oldboyedu.com /oldboyedu/dns]# 
[root@k8s101.oldboyedu.com /oldboyedu/dns]# kubectl apply -f .  # 执行当前目录下的所有资源清单。
service "kube-dns" created
deployment "kube-dns" created
[root@k8s101.oldboyedu.com /oldboyedu/dns]# 

(2)检查DNS的Pod资源是否创建成功
[root@k8s101.oldboyedu.com ~]# kubectl get all --namespace=kube-system -o wide

温馨提示:
    使用"kubectl delete -f ."可以同时删除当前目录的所有资源清单配置的资源哟。

image-20210721221633880

6.修改kubelet,指定自定义的DNS地址

(1)修改配置文件
[root@k8s103.oldboyedu.com ~]# vim /etc/kubernetes/kubelet

...

# 指定集群的DNS地址及域名信息,所谓的DNS地址指的就是DNS的Pod其SVC暴露的CLUSTER-IP地址哟~
KUBELET_ARGS="--cluster_dns=10.254.254.254 --cluster_domain=cluster.local"

[root@k8s103.oldboyedu.com ~]# systemctl restart kubelet.service 

温馨提示:
    (1)咱们的kubelet服务基于yum方式安装,可以查看其启动脚本,当我们启动kubelet时会顺带将docker启动哟;
    (2)我们Pod组件是基于kubelet组件调用docker引擎创建的哟,因此我们可以在kubelet配置一些参数在启动docker时传递即可;
    (3)咱们使用"docker [container] run ..."启动容器时,可以基于"--dns"参数来指定DNS信息,若不指定则默认使用宿主机的DNS信息。

image-20210721224824849

7.启动tomcat和mysql测试实例

(1)编写"mysql-deploy.yml"文件
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# cat mysql-deploy.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: oldboyedu-mysql
    spec:
      containers:
        - name: mysql
          image: k8s101.oldboyedu.com:5000/mysql:5.7
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: '123456'
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# 

(2)编写"mysql-svc.yml"文件
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# cat mysql-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: oldboyedu-mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
  selector:
    app: oldboyedu-mysql
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# 

(3)编写"tomcat-deploy.yml"文件
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# cat tomcat-deploy.yml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-web
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: oldboyedu-tomcat-app
    spec:
      containers:
        - name: myweb
          image: k8s101.oldboyedu.com:5000/tomcat-app:v1
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            # value: '10.254.87.39'  # 指定MySQL的svc资源的VIP地址即可.
            value: oldboyedu-mysql  # 指定MySQL的svc资源的名称即可,无需指定IP地址
          - name: MYSQL_SERVICE_PORT
            value: '3306'
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# 

(4)编写" tomcat-svc.yml"文件
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# cat tomcat-svc.yml 
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30008
  selector:
    app: oldboyedu-tomcat-app
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# 

(5)批量运行文件
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# kubectl apply -f .
deployment "mysql" created
service "oldboyedu-mysql" created
deployment "oldboyedu-web" created
service "myweb" created
[root@k8s101.oldboyedu.com /oldboyedu/deploymentController/tomcat_demo]# 

image-20210721225811314

8.验证DNS解析是否正常

[root@k8s101.oldboyedu.com ~]# kubectl get svc -n kube-system 
NAME       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kube-dns   10.254.230.254   <none>        53/UDP,53/TCP   20h
[root@k8s101.oldboyedu.com ~]# 
[root@k8s101.oldboyedu.com ~]# kubectl get all -o wide
NAME                   DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deploy/mysql           1         1         1            1           19h
deploy/oldboyedu-web   1         1         1            1           19h

NAME                  CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
svc/kubernetes        10.254.0.1      <none>        443/TCP          18d       <none>
svc/myweb             10.254.224.36   <nodes>       8080:30008/TCP   19h       app=oldboyedu-tomcat-app
svc/oldboyedu-mysql   10.254.252.26   <none>        3306/TCP         19h       app=oldboyedu-mysql

NAME                          DESIRED   CURRENT   READY     AGE       CONTAINER(S)   IMAGE(S)                                  SELECTOR
rs/mysql-698607359            1         1         1         19h       mysql          k8s101.oldboyedu.com:5000/mysql:5.7       app=oldboyedu-mysql,pod-template-hash=698607359
rs/oldboyedu-web-1912278232   1         1         1         19h       myweb          k8s101.oldboyedu.com:5000/tomcat-app:v1   app=oldboyedu-tomcat-app,pod-template-hash=1912278232

NAME                                READY     STATUS    RESTARTS   AGE       IP            NODE
po/mysql-698607359-2jjnz            1/1       Running   1          19h       172.18.39.2   k8s104.oldboyedu.com
po/oldboyedu-web-1912278232-gcxn1   1/1       Running   1          19h       172.18.13.2   k8s103.oldboyedu.com
[root@k8s101.oldboyedu.com ~]# 
[root@k8s101.oldboyedu.com ~]# kubectl exec -it oldboyedu-web-1912278232-gcxn1 /bin/bash
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# grep nameserver /etc/resolv.conf
nameserver 10.254.230.254
nameserver 172.200.7.254
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# 
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# ping oldboyedu-mysql
PING oldboyedu-mysql.default.svc.cluster.local (10.254.252.26): 56 data bytes
^C--- oldboyedu-mysql.default.svc.cluster.local ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# 
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# 
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# ping kube-dns.kube-system.svc.cluster.local
PING kube-dns.kube-system.svc.cluster.local (10.254.230.254): 56 data bytes
^C--- kube-dns.kube-system.svc.cluster.local ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
root@oldboyedu-web-1912278232-gcxn1:/usr/local/tomcat# 

温馨提示:
    (1)如下图所示,我们成功对"oldboyedu-mysql"这个service名称解析成功啦;
    (2)由于SVC暴露的是一个VIP地址,因此我们始终无法ping通,这属于正常现象,但实际测试我们可以基于其进行通信的哟;
    (3)对于同一个namespace资源而言,我们可以直接使用svc进行解析,而对于不同的namespace资源而言,
若想要解析svc资源,则需要写遵循ClusterIP A记录格语法格式,即"<service-name>.<namespace-name>.svc.cluster.local"

image-20210722182205967

二.namespace命名空间

1.namespace的作用

在K8S集群中,一切皆资源。而namespace的作用主要是做资源隔离的。

如下图所示,若不为资源指定名称空间,则默认使用的是"default"资源。

一旦有了namespace我们就可以对资源进行分门别类,值得注意的是,在同一个名称空间的同一种资源类型是不能重名的,但不同的名称空间是可以出现同名的资源类型哟。

image-20210722173325186

2.编写namespace资源清单

(1)基于命令创建namespace
kubectl create namespace oldboyedu  # 创建oldboyedu资源
kubectl delete namespace oldboyedu  # 删除oldboyedu资源

(2)基于yaml编写资源清单
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# vim oldboyedu.yaml
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# cat oldboyedu.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: oldboyedu
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl get pods
NAME                             READY     STATUS    RESTARTS   AGE
mysql-698607359-2jjnz            1/1       Running   1          20h
oldboyedu-web-1912278232-gcxn1   1/1       Running   1          20h
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl get ns
NAME          STATUS    AGE
default       Active    18d
kube-system   Active    18d
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl apply -f oldboyedu.yaml
namespace "oldboyedu" created
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl get ns
NAME          STATUS    AGE
default       Active    18d
kube-system   Active    18d
oldboyedu     Active    1s
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl delete -f oldboyedu.yaml
namespace "oldboyedu" deleted
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# kubectl get ns
NAME          STATUS    AGE
default       Active    18d
kube-system   Active    18d
[root@k8s101.oldboyedu.com /oldboyedu/namespace]# 

温馨提示:
    删除一个namespace时,这意味着该名称空间下的所有资源都将被删除,生产环境中请谨慎使用!

image-20210722202038252

3.将tocat服务迁移到oldboyedu命名空间

我们参考之前的tomcat + mysql案例,直接对这些yaml文件的第三行追加一行namespace信息即可。
    sed -i '3a \ \ namespace: oldboyedu' *

具体代码此处直接省略,直接基于之前的环境配置即可哟~

image-20210722194806826

三.健康检查和可用性检查探针(Probe)

1.模拟故障案例

(1)基于命令行方式创建一个deployment资源
kubectl run oldboyedu-linux --image=k8s101.oldboyedu.com:5000/nginx:1.18 

(2)基于命令行方式暴露相关服务,创建SVC
kubectl expose  deploy/oldboyedu-linux --type=NodePort

(3)观察svc的EP的Pod信息,并使用浏览器测试.
kubectl describe svc/oldboyedu-linux

(4)删除deployment资源,目的是让其删除创建的Pod
kubectl delete deploy/oldboyedu-linux

(5)再次观察svc的EP的Pod信息,并使用浏览器测试.
kubectl describe svc/oldboyedu-linux

(6)删除测试资源
kubectl delete all --all

综上所述,监听端口并不能保证服务是可用的,也不能保证服务是存活。因此对于Pod而言,我们也需要相关的监控及健康检查。

2.探针(Probe)概述

常用探针的种类:
    livenessProbe:
        健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器。
    readinessProbe:
        可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除。

探针的检测方法:
    exec:
        执行一段命令,根据返回值判断执行结果。
        返回值为0, 非0两种结果,可以理解为"echo $?"。
    httpGet:
        通过发起HTTTP协议的GET请求检测某个http请求的返回状态码,从而判断服务是否正常。
        常见的状态码分为很多类,比如: "2xx,3xx"正常, "4xx,5xx"错误。
            200: 返回状态码成功。
            301: 永久跳转,会将跳转信息缓存到浏览器本地。
            302: 临时跳转,并不会将本次跳转缓存到本地。
            401: 验证失败。
            403: 权限被拒绝。
            404: 文件找不到。
            413: 文件上传过大。
            500: 服务器内部错误。
            502: 无效的请求。
            504: 后端应用网关相应超时。
            ...
    tcpSocket:
        测试某个TCP端口是否能够连接,类似于telnet这样的工具。

    温馨提示:
        如下图所示,对于健康检查("livenessProbe")和可用性检查("readinessProbe)是可以同时使用的哟。

image-20210723000033722

3.健康检查探针(livenessProbe)的exec使用

[root@k8s101.oldboyedu.com /oldboyedu/check_probe]# cat nginx_pod_exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: oldboyedu-exec  # 指定Pod名称
spec:
  containers:  # 配置容器相关参数
    - name: nginx  # 指定容器的名称
      image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13  # 指定镜像版本
      ports:
        - containerPort: 80  # 指定暴露容器的端口
      args:  # 指定容器启动时初始化命令。
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
      livenessProbe:  # 定义健康检查探针
        exec:  # 指定探针的检测方法为exec。
          command:  # 指定exec要执行的命令
            - cat
            - /tmp/healthy
        initialDelaySeconds: 5  # 指定第一次进行健康检查的秒数,该值在生产环境中应该确保这个延迟时间内容器可以正常启动运行。
        periodSeconds: 10  # 指定每次周期的健康检查的间隔时间。
        timeoutSeconds: 5  # 指定执行exec定义命令的超时的秒数。
        successThreshold: 1  # 检查1次成功就认为服务是健康的。
        failureThreshold: 3  # 检查连续3次失败就认为服务是不健康的。
[root@k8s101.oldboyedu.com /oldboyedu/check_probe]# 

温馨提示:
    如下图所示,当我们手动启动Pod后,可以执行"kubectl describe pod oldboyedu-exec"指令来查看Pod的运行情况。很明显每次Pod被kill掉并重新被创建其对应的重启次数会进行加1哟~

image-20210722223818677

4.健康检查探针(livenessProbe)的httpGet使用

[root@k8s101.oldboyedu.com ~]# cat nginx_pod_httpGet.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: oldboyedu-httpget
spec:
  containers:
    - name: nginx
      image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13
      ports:
        - containerPort: 80
      livenessProbe:
        httpGet:  # 指定探针的检测方法为httpGet。
          path: /index.html  # 指定访问的文件路径信息即可,无需指定IP地址,因为默认就是访问本机,可以理解为127.0.0.1。
          port: 80  # 指定对容器的哪个端口发送GET请求。
        initialDelaySeconds: 3
        periodSeconds: 3
[root@k8s101.oldboyedu.com ~]# 

温馨提示:
    正常情况下,我们启动Pod是并不会触发重启操作的,因此我们需要故意去搞一下破坏,可以进入到容器去删除首页文件,当检测到index.html访问不到时,就会杀死容器重新启动。
    如下图所示,我们可以执行"kubectl describe pod oldboyedu-httpget"命令进行分析,并观察重启次数会加1哟。

[root@k8s101.oldboyedu.com ~]# kubectl exec -it oldboyedu-httpget bash
root@oldboyedu-httpget:/# ls -l /usr/share/nginx/html/index.html 
-rw-r--r-- 1 root root 612 Apr  9  2018 /usr/share/nginx/html/index.html
root@oldboyedu-httpget:/# 
root@oldboyedu-httpget:/# rm -f /usr/share/nginx/html/index.html 
root@oldboyedu-httpget:/# 
root@oldboyedu-httpget:/# ls -l /usr/share/nginx/html/index.html 
ls: cannot access '/usr/share/nginx/html/index.html': No such file or directory
root@oldboyedu-httpget:/# 
root@oldboyedu-httpget:/# exit
exit
[root@k8s101.oldboyedu.com ~]# 

image-20210722230401439

5.健康检查探针(livenessProbe)的tcpSocket使用

[root@k8s101.oldboyedu.com ~]# cat nginx_pod_tcpSocket.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: oldboyedu-tcpsocket
spec:
  containers:
    - name: nginx
      image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13
      ports:
        - containerPort: 80
      args:
        - /bin/sh
        - -c
        - tail -f /etc/hosts
      livenessProbe:
        tcpSocket:
          port: 80  # 检测80端口是否可以连通,若连不通则会抛出检查容器出现问题,而后重启容器。
        initialDelaySeconds: 10
        periodSeconds: 3
[root@k8s101.oldboyedu.com ~]# 

温馨提示:
    很明显,上述案例暴露了80端口,可惜呀,启动容器时并没有启动nginx,而是去使用tail指令去查看一个文件内容达到阻塞容器的目的,因此在容器启动10后就开始第一次检查,而后每个3秒检查1次,达到指定次数后会触发重启操作,这个失败的次数我们是可以自定义的哟,通过"failureThreshold"参数定义即可。

image-20210722231542262

6.可用性检查探针(readinessProbe)的httpGet使用

[root@k8s101.oldboyedu.com ~]# cat 04-nginx-rc-httpGet.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: oldboyedu-readiness
spec:
  replicas: 2
  selector:
    app: readiness
  template:
    metadata:
      labels:
        app: readiness
    spec:
      containers:
      - name: readiness
        image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13
        ports:
        - containerPort: 80
        readinessProbe:  # 检查服务的可用性
          httpGet:
            path: /oldboyedu.html  # 指定检查的路径,若该文件不存在,则容器始终不会启动成功,除非我们手动将其创建哟~
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3
[root@k8s101.oldboyedu.com ~]# 
[root@k8s101.oldboyedu.com ~]# kubectl expose rc oldboyedu-readiness --port=80 --target-port=80 --type=NodePort
service "oldboyedu-readiness" exposed
[root@k8s101.oldboyedu.com ~]# 

温馨提示:
    (1)暴露svc后,记得使用"kubectl describe svc oldboyedu-readiness"指令观察"Endpoints"字段信息。
    (2)我们可以进入到任意一个Pod中,手动创建"/usr/share/nginx/html/oldboyedu.html"文件,你会发现其会自动进行关联,如下图所示。

image-20210722234556103

7.课堂练习-使用deployment资源控制器并使用健康检查和可用性检查结合案例

[root@k8s110 check_probe]# cat 05-oldboyedu-check_probe_nginx_pod_deployment.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux-pod-check-probe
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: readiness-deployment
    spec:
      containers:
      - name: oldboyedu-readiness-demo
        image: k8s110.oldboyedu.com:5000/oldboyedu-nginx/alpine-82:1.18
        livenessProbe:
          httpGet:
            path: /index.html
            port: 82
          initialDelaySeconds: 3
          periodSeconds: 3
        readinessProbe:
          httpGet:
            path: /oldboyedu.html  
            port: 82
          initialDelaySeconds: 3
          periodSeconds: 3

---

apiVersion: v1
kind: Service
metadata:
  name: oldboyedu-nginx-1-18-deloyment
spec:
  type: NodePort
  ports:
    - port: 80
      protocol: TCP
      nodePort: 30000
      targetPort: 82
  selector:
    app: readiness-deployment
[root@k8s110 check_probe]# 

四.部署dashboard

1.dashboard概述

dashboard可以将K8S集群的操作封装成WebUI进行操作。不仅如此,我们还可以对其进行角色访问控制哟。

2.安装dashboard服务

image-20210723153208352

(1)编写dashboard的资源清单
[root@k8s101.oldboyedu.com ~]# cat dashboard.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# Keep the name in sync with image version and
# gce/coreos/kube-manifests/addons/dashboard counterparts
  name: kubernetes-dashboard-latest
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        version: latest
        kubernetes.io/cluster-service: "true"
    spec:
      nodeName: k8s103.oldboyedu.com
      containers:
      - name: kubernetes-dashboard
        image: k8s101.oldboyedu.com:5000/kubernetes-dashboard-amd64:v1.4.1
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        ports:
        - containerPort: 9090
        args:
         -  --apiserver-host=http://k8s101.oldboyedu.com:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
[root@k8s101.oldboyedu.com ~]# 

(2)编写svc服务
[root@k8s101.oldboyedu.com /oldboyedu/dashboard]# cat dashboard-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
    targetPort: 9090
[root@k8s101.oldboyedu.com /oldboyedu/dashboard]# 

(3)应用配置文件创建service和deployment资源。
[root@k8s101.oldboyedu.com /oldboyedu/dashboard]# kubectl apply -f .
service "kubernetes-dashboard" configured
deployment "kubernetes-dashboard-latest" configured
[root@k8s101.oldboyedu.com /oldboyedu/dashboard]# 

温馨提示:
    我们上面创建的service资源并没有指定类型,则会使用默认的ClusterIP类型。因此我们无法直接访问Dashboard的WebUI,那么问题来了,我们该如何才能访问到呢?除了使用NodePort类型外还有其它方法吗?

image-20210723154304939

3.访问dashboard的WebUI

上一步说了由于我们没有配置svc的类型为NodePort,因此无法直接访问dashboard的WebUI。

如下图所示,我们可以基于ApiServer进行反向代理,直接访问"/ui"这个PATH就可以成功访问dashboard啦!

温馨提示:
    (1)在K8S1.5版本之前,StatefulSet的前身为"Pet Sets",尽管我们使用的K8S为1.5版本,但我们的dashboard使用的是"v1.4.1"。
    (2)尽管我们没有对service配置NodePort,但我们可以通过apiserver反向代理访问service,但这样的话URL会很长,因此建议大家还是使用NodePort类型对外提供访问,这样对用户来说比较友好。

image-20210723161305463

五.通过apiserver反向代理访问service

1.分析通过apiserver反向代理访问service

我们以dashboard服务为例,分析通过apiserver反向代理访问service如下:
    (1)带有锚点的URL(其中以"#"之后的所有内容均为锚点)
    http://k8s101.oldboyedu.com:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/#/workload?namespace=default
    (2)找出真实的URL,如下所示:
    http://k8s101.oldboyedu.com:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard
    (3)分析通过apiserver反向代理访问service的语法格式
http://k8s101.oldboyedu.com:8080/api/v1/proxy/namespaces/<Pod资源所在的名称空间>/services/<暴露Pod资源的service名称>

温馨提示:
    尽管我们没有对service配置NodePort,但我们可以通过apiserver反向代理访问service,但这样的话URL会很长,因此建议大家还是使用NodePort类型对外提供访问,这样对用户来说比较友好。

2.测试案例

(1)创建名称空间
[root@k8s101.oldboyedu.com /oldboyedu/pods]# cat 01_nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: oldboyedu-nginx
  labels:
    app: web01
spec:
  containers:
    - name: nginx
      image: k8s101.oldboyedu.com:5000/docker.io/nginx:1.13
      ports:
        - containerPort: 80
[root@k8s101.oldboyedu.com /oldboyedu/pods]# 

(2)创建service资源
kubectl expose pod oldboyedu-nginx --port=80 --target-port=80 --name=oldboyedu-web

(3)通过以上信息访问oldboyedu-web对应的资源
http://k8s101.oldboyedu.com:8080/api/v1/proxy/namespaces/default/services/oldboyedu-web/

补充案例:
[root@k8s110 dashboard]# cat 04-deploy-svc-nginx.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: oldboyedu-linux76-nginx-proxy
spec:
  replicas: 5
  template:
    metadata:
      labels:
        school: oldboyedu
    spec:
      containers:
      - name: linux76-nginx
        image: k8s110.oldboyedu.com:5000/oldboyedu-nginx/alpine-82:1.18

---

apiVersion: v1
kind: Service
metadata:
  name: oldboyedu-proxy-svc
spec:
  ports:
    - port: 80
      targetPort: 82
  selector:
    school: oldboyedu
[root@k8s110 dashboard]# 

image-20210726170151213

谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇