本文最后更新于 321 天前,其中的信息可能已经过时,如有错误请发送邮件到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
2.导入dns_docker镜像包
[root@k8s102.oldboyedu.com ~]# docker image load -i docker_k8s_dns.tar.gz
温馨提示:
如下图所示,我们导入dns的镜像包,一共会成功导入4个镜像。
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"是没有相关的解析!
4.修改官方的skydns-svc.yaml配置文件
[root@k8s101.oldboyedu.com /oldboyedu/dns]# vim skydns-svc.yaml
...
spec:
...
clusterIP: 10.254.254.254
温馨提示:
修改SVC的IP地址本质上修改是后期暴露的DNS地址哟~
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 ."可以同时删除当前目录的所有资源清单配置的资源哟。
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信息。
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]#
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"
二.namespace命名空间
1.namespace的作用
在K8S集群中,一切皆资源。而namespace的作用主要是做资源隔离的。
如下图所示,若不为资源指定名称空间,则默认使用的是"default"资源。
一旦有了namespace我们就可以对资源进行分门别类,值得注意的是,在同一个名称空间的同一种资源类型是不能重名的,但不同的名称空间是可以出现同名的资源类型哟。
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时,这意味着该名称空间下的所有资源都将被删除,生产环境中请谨慎使用!
3.将tocat服务迁移到oldboyedu命名空间
我们参考之前的tomcat + mysql案例,直接对这些yaml文件的第三行追加一行namespace信息即可。
sed -i '3a \ \ namespace: oldboyedu' *
具体代码此处直接省略,直接基于之前的环境配置即可哟~
三.健康检查和可用性检查探针(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)是可以同时使用的哟。
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哟~
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 ~]#
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"参数定义即可。
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"文件,你会发现其会自动进行关联,如下图所示。
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服务
(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类型外还有其它方法吗?
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类型对外提供访问,这样对用户来说比较友好。
五.通过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]#