赞
踩
第六题:
service配置
解析:
考察两个知识点:
deployment控制器内的port命名
暴露一个pod内的端口到新建的服务内的
这里有一个需要注意的地方,没有告诉你deployment控制器在哪个namespace。假设这个front-end这个pod是在A这个namespace内,那么,service创建的时候也必须是在A这个namespace里,否则,service无法正常工作。
这也算是这道题目的一个小陷阱。
解题:
1,查询deployment
- root@k8s-master:~# kubectl get deployments.apps -A
- NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
- default front-end 1/1 1 1 359d
- default guestbook 6/6 6 6 359d
- default nfs-client-provisioner 1/1 1 1 359d
2,编辑front-end,给端口命名为http,修改的内容是这些,修改完毕后保存退出:
- ports:
- - containerPort: 80
- name: http
- protocol: TCP
3,新增type为NodePort的service:
这里的target-port要引用上面创建的端口,名称为http
- root@k8s-master:~# kubectl expose deployment front-end --type=NodePort --target-port=http --port=80 --dry-run=client -oyaml >6.yaml
-
修改6.yaml文件,将service名字修改成符合题目要求的名字
4,测试
查看新建的service
- root@k8s-master:~# kubectl get svc
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- front-end-svc NodePort 10.97.221.101 <none> 80:32678/TCP 5s
- kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 375d
-
-
curl 这个service 节点IP+332678,如果出现200,表示service正常:
- root@k8s-master:~# curl -i 192.168.123.150:32678
- HTTP/1.1 200 OK
- Server: nginx/1.21.5
- Date: Sun, 18 Dec 2022 09:33:59 GMT
- Content-Type: text/html
- Content-Length: 615
- Last-Modified: Tue, 28 Dec 2021 15:28:38 GMT
- Connection: keep-alive
- ETag: "61cb2d26-267"
- Accept-Ranges: bytes
-
第七题:
解析:
这道题有两种解法,第一种是在官网找示例修改,第二种是命令行方式直接创建ingress,只是需要注意最后要测试创建的ingress是否正确。
第一种方式:
在官网找ingress的示例,官网地址如下:
第一个示例就可以符合题意:
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- name: minimal-ingress
- annotations:
- nginx.ingress.kubernetes.io/rewrite-target: /
- spec:
- ingressClassName: nginx-example
- rules:
- - http:
- paths:
- - path: /testpath
- pathType: Prefix
- backend:
- service:
- name: test
- port:
- number: 80
修改成如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ping namespace: ing-internal annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - http: paths: - pathType: Prefix path: /hello backend: service: name: hello port: number: 5678
测试:
查看ingress代理的service结果是什么:
- root@k8s-master:~# kubectl get svc -A
- NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- default front-end-svc NodePort 10.97.221.101 <none> 80:32678/TCP 92m
- default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 375d
- ing-internal hello ClusterIP 10.106.182.229 <none> 5678/TCP 360d
- root@k8s-master:~# curl 10.106.182.229:5678
- hello
-
查看ingress代理的结果,如果输出都一样,表明ingress是正确的:
- root@k8s-master:~# kubectl get ing -A
- NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
- ing-internal ping nginx * 192.168.123.150,192.168.123.151,192.168.123.152 80 3d20h
- root@k8s-master:~# curl 192.168.123.150/hello
- hello
第二种方式----命令行直接生成:
生成模板文件
ping是ingress的名字,hello:5678 是service的名称和端口
kubectl create ingress -n ing-internal ping --rule=/hello=hello:5678 --annotation=nginx.ingress.kubernetes.io/rewrite-target=/ --dry-run=client -oyaml >7.yaml
查看模板文件:
- root@k8s-master:~# cat 7.yaml
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- annotations:
- nginx.ingress.kubernetes.io/rewrite-target: /
- creationTimestamp: null
- name: ping
- namespace: ing-internal
- spec:
- rules:
- - http:
- paths:
- - backend:
- service:
- name: hello
- port:
- number: 5678
- path: /hello
- pathType: Exact
- status:
- loadBalancer: {}
应用模板文件并进行测试:
kubectl apply -f 7.yaml
需要等待一段时间,直到查询出的ingress绑定有节点的IP后:
- root@k8s-master:~# kubectl get ing -A
- NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
- ing-internal ping <none> * 192.168.123.150,192.168.123.151,192.168.123.152 80 104s
最终测试:
- root@k8s-master:~# curl 192.168.123.150/hello
- hello
第八题:
解析:这个题确实是送分题,没什么好说的。照做即可。
第九题:
解析:
这个题也是送分题,两步即可完成。
·1,查看节点的标签 是否有disk=ssd,没有则挑选一个节点打上这个标签
- root@k8s-master:~# kubectl get no --show-labels
- NAME STATUS ROLES AGE VERSION LABELS
- k8s-master Ready control-plane,master 375d v1.22.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
- k8s-node1 Ready <none> 5d20h v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
- k8s-node2 Ready <none> 5d20h v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
节点没有这个标签,因此,随便选择一个节点,本例选择node2节点,打 disk=ssd这个标签:
- root@k8s-master:~# kubectl label no k8s-node2 disk=ssd
- node/k8s-node2 labeled
确认标签是否正确:
- root@k8s-master:~# kubectl get no --show-labels |grep ssd
- k8s-node2 Ready <none> 5d20h v1.22.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux
2,按照题意生成模板文件,给模板文件添加nodeSelector
生成模板文件:
kubectl run nginx-kusc0041 --image=nginx --dry-run=client -oyaml >9.yaml
编辑模板文件,最后结果如下:
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx-kusc0041 name: nginx-kusc0041 spec: containers: - image: nginx name: nginx-kusc0041 resources: {} dnsPolicy: ClusterFirst restartPolicy: Always nodeSelector: disk: ssd status: {}
执行模板文件并验证是否正确调度到了k8s-node2节点:
- root@k8s-master:~# kubectl apply -f 9.yaml
- pod/nginx-kusc0041 created
- root@k8s-master:~# kubectl get po nginx-kusc0041 -owide
- NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
- nginx-kusc0041 1/1 Running 0 2m39s 10.244.169.149 k8s-node2 <none> <none>
第十题:
这个题也是送分题,没什么好说的,直接就看出来的:
- root@k8s-master:~# kubectl describe nodes |grep -i Taint |grep -iv NoScheduole
- Taints: node-role.kubernetes.io/master:NoSchedule
- Taints: <none>
- Taints: <none>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。