您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
35、Service Ingress(vi小技巧co)
发布时间:2022-12-28 21:41:47编辑:雪饮阅读()
Step1
上篇把镜像保存ok后,接着我们分别放到每个节点上,当然master本来就有,而且master应该是不用放的。
为了规范操作,则node1和node2节点上我建立同样的路径
mkdir -p /usr/local/install-k8s/plugin/ingress
然后
scp ingress.contr.tar root@k8s-node01:/usr/local/install-k8s/plugin/ingress/
scp ingress.contr.tar root@k8s-node02:/usr/local/install-k8s/plugin/ingress/
然后在节点1和节点2上都导入该镜像
cd /usr/local/install-k8s/plugin/ingress
docker load -i ingress.contr.tar
然后master就可以开始创建了
[root@k8s-master01 ingress]# kubectl apply -f mandatory.yaml
namespace/ingress-nginx created
deployment.extensions/default-http-backend created
service/default-http-backend created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.extensions/nginx-ingress-controller created
这里又打脸。。。
虽然创建成功,但是由于各个节点拉取另外一个镜像超时。。。
那么如法炮制在一个国外服务器上保存镜像
docker save -o k8s.gcr.io_defaultbackend-amd64_1.5.tar k8s.gcr.io/defaultbackend-amd64:1.5
然后传入在各个节点将该镜像再次加载。。。
然后咱们master上再次删除刚才的创建
[root@k8s-master01 ingress]# kubectl delete -f mandatory.yaml
然后再次重新创建哈。。。
然后你会发现再次打脸。。。
于是经过我的各种折腾最后觉得
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/mandatory.yaml
是最贴近的。
但是可能是里面依赖的那个镜像内部又依赖的nginx镜像与老师当时的nginx的镜像版本不同导致吧。
那么经过如
kubectl describe pod -n ingress-nginx nginx-ingress-controller-7995bd9c47-m4sdx
命令查看到有Liveness probe和Readiness probe的错误,结合之前我们的学习这两个是要保证目标镜像内部中有对应访问条件必须达成,否则这两个各自的条件不达成,则各自会认定为不同的错误。
所以我最后弄了一个0.25.1的改版就是把这两个保证条件给干掉了的一个版本
然后我这里终于跑成功了
[root@k8s-master01 ingress]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-f77bdf77b-kbmxt 1/1 Running 0 2s
具体有什么问题,这里先不处理了,明天继续。
这边想说的是,上面那个其实貌似也可以不用把那两个检测的模块移除,可以延长那两个检测模块的检测时间,可能我的系统现在比较卡顿导致检测超时了都还没有响应。。
Step2
本来接下来要用暴露模板
但是这个暴露模板也找不到了。。。
我用0.24.1这个暂时先试试
我这里拿到后重命名然后再用(免的有什么问题,也好分清当前用的版本)
[root@k8s-master01 ~]# kubectl apply -f service-nodeport0.24.1.yaml
service/ingress-nginx created
然后可以看到80和443各自暴露了一个哈
[root@k8s-master01 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.102.113.200 <none> 80:30242/TCP,443:31369/TCP 110s
Step3使用http代理
Yaml模板如
[root@k8s-master01 ~]# cat ingress.http.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-dm
spec:
replicas: 2
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort : 80
protocol: TCP
selector:
name: nginx
然后创建
[root@k8s-master01 ~]# kubectl apply -f ingress.http.yaml
deployment.extensions/nginx-dm unchanged
service/nginx-svc created
这里应该是nginx-dm create,但是却显示nginx-dm unchanged。。
有点意外,暂时先记录下
然后可以看到svc是可以访问的
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d
my-service-1 ExternalName <none> hub.atguigu.com <none> 2d7h
myapp NodePort 10.101.243.120 <none> 80:30821/TCP 6d23h
myapp-headless ClusterIP None <none> 80/TCP 6d23h
nginx-svc ClusterIP 10.108.113.151 <none> 80/TCP 2m51s
[root@k8s-master01 ~]# curl 10.108.113.151
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
那就没有问题了,顺带我们测试下之前0.25.1的mandatory的yaml文件中
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
或
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
这两段检测中有get的请求/healthz以实现检测的
那么可见我们访问就是404咯。。。
[root@k8s-master01 ~]# curl 10.108.113.151/healthz
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.12.2</center>
</body>
</html>
所以我觉得我将这两个检测给干掉是应该是对的。
可能之前老师那个版本正好就是对应有这个/healthz路径可以访问,而我这个版本的可能没有吧。
Step4
http代理下部分的模板
[root@k8s-master01 ~]# cat ingress1.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
spec:
rules:
- host: www1.atguigu.com
http:
paths:
- path: /
backend:
serviceName : nginx-svc
servicePort: 80
这里这个nginx-svc是关联上面创建的svc的
然后同样创建
[root@k8s-master01 ~]# kubectl apply -f ingress1.yaml
ingress.extensions/nginx-test created
然后咱们的物理机win11上面可以增加解析如
192.168.66.10 www1.atguigu.com
然后浏览器中就可以访问www1.atguigu.com但是要加上端口如
[root@k8s-master01 ~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.102.113.200 <none> 80:30242/TCP,443:31369/TCP 65m
这里自然是30242了
实际上接下来按理说应该就是上面浏览器访问www1.atguigu.com:30242就能看到nginx返回的页面,结果现在给我提示连接被拒绝。。。
结合下面这个结果。。。
[root@k8s-master01 ingress]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-f77bdf77b-2stkc 1/1 Running 4 29m
[root@k8s-master01 ingress]# kubectl exec nginx-ingress-controller-f77bdf77b-2stkc -it -n ingress-nginx /bin/bash
www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$ vi nginx.conf
bash: vi: command not found
www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$ cat nginx.conf
# A very simple nginx configuration file that forces nginx to start.
pid /tmp/nginx.pid;
events {}
http {}
daemon off;www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$
以及这个小伙子说的话
部署kubernetes/ingress-nginx(踩坑) - JavaShuo
我是怀疑这个nginx-ingress-controller:0.25.0有問題,(但我这里用的实际上上mandatory0.25.1里面带的0.25.0,假如我直接也使用mandatory0.25.0可以试试)
不过明天再试吧,今天太晚了。
毕竟老师用的就是0.25.0的,我就是有点想不通的哈。而且目前来说,我在svc上面还是可以访问的啊?
[root@k8s-master01 ingress]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
my-service-1 ExternalName <none> hub.atguigu.com <none> 2d8h
myapp NodePort 10.101.243.120 <none> 80:30821/TCP 7d
myapp-headless ClusterIP None <none> 80/TCP 7d
nginx-dm NodePort 10.97.54.233 <none> 80:32033/TCP 52m
nginx-svc ClusterIP 10.108.133.19 <none> 80/TCP 35m
[root@k8s-master01 ingress]# curl 10.108.133.19
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
算了,明天先试试原版0.25.0的去除健康检查和另外那个30版
经过本王又一天的折腾,虽然无解,但大概率也是弄不了,应该是与上次那个一样的道理,就是说那个ingress-nginx里面可能因为某种版本或者latest类似原因导致的,然后就不成功了,这里也不再纠结了,继续下一个。
Step5
清理下目前对我们来说没有用的svc,防止接下来的实验时候看到好多没有用的东西,影响我们的判断。
kubectl delete svc nginx-svc1
kubectl delete svc nginx-svc
kubectl delete svc myapp-headless
kubectl delete svc myapp my-service-1
deployment也清理下
kubectl delete deployment –all
Step6
准备创建虚拟主机
mkdir ingress-vh
[root@k8s-master01 ingress]# cp ingress.http.yaml ingress-vh/
[root@k8s-master01 ingress]# cd ingress-vh
[root@k8s-master01 ingress-vh]# ls
ingress.http.yaml
然后将这个新的http代理的模板文件名及里面的代码修改下不同之前一样,主要是这两处
[root@k8s-master01 ingress-vh]# cat ingress.http2.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deployment1
spec:
replicas: 2
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
ports:
- port: 80
targetPort : 80
protocol: TCP
selector:
name: nginx
然后创建
[root@k8s-master01 ingress-vh]# kubectl apply -f ingress.http2.yaml
deployment.extensions/deployment1 created
service/svc-1 created
然后就可以看到这个svc-1了
[root@k8s-master01 ingress-vh]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
nginx-dm NodePort 10.97.54.233 <none> 80:32033/TCP 22h
svc-1 ClusterIP 10.108.237.235 <none> 80/TCP 39s
然后我们再创建一个模板
[root@k8s-master01 ingress-vh]# cp ingress.http2.yaml ingress.http3.yaml
[root@k8s-master01 ingress-vh]# cat ingress.http3.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: deployment2
spec:
replicas: 2
template:
metadata:
labels:
name: nginx2
spec:
containers:
- name: nginx2
image: wangyanglinux/myapp:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
ports:
- port: 80
targetPort : 80
protocol: TCP
selector:
name: nginx2
这里其他地方还都是算不得什么哈,主要就是这几个nginx2是关联一起的,并且不能和上面那个yaml相同。
然后同样是创建
[root@k8s-master01 ingress-vh]# kubectl apply -f ingress.http3.yaml
deployment.extensions/deployment2 created
service/svc-2 created
然后这第二个svc也就出来了
[root@k8s-master01 ingress-vh]#
[root@k8s-master01 ingress-vh]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 14d
nginx-dm NodePort 10.97.54.233 <none> 80:32033/TCP 22h
svc-1 ClusterIP 10.108.237.235 <none> 80/TCP 5m51s
svc-2 ClusterIP 10.111.255.206 <none> 80/TCP 27s
那么接下来我们将两个svc整合到一起
[root@k8s-master01 ingress-vh]# cat ingress_multipart.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress1
spec:
rules:
- host: www1.atguigu.com
http:
paths:
- path: /
backend:
serviceName : svc-1
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress2
spec:
rules:
- host: www2.atguigu.com
http:
paths:
- path: /
backend:
serviceName : svc-2
servicePort: 80
这里可以多学到一个技能
Vi小技巧:
命令行模式下输入
6,9 co 12
复制第6行到第9行之间的内容到第12行后面。
然后一起创建两个ingress
[root@k8s-master01 ingress-vh]# kubectl apply -f ingress_multipart.yaml
ingress.extensions/ingress1 created
ingress.extensions/ingress2 created
有时候就这么神奇
[root@k8s-master01 ingress-vh]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-f77bdf77b-2stkc 0/1 CrashLoopBackOff 17 22h
现在是坏了
现在又好了
[root@k8s-master01 ingress-vh]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-f77bdf77b-2stkc 1/1 Running 18 22h
。。。
接下来我们看看我们的这两条ingress规则的生效
[root@k8s-master01 ingress-vh]# kubectl exec nginx-ingress-controller-f77bdf77b-2stkc -n ingress-nginx -it -- /bin/bash
www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$ ls
geoip lua mime.types modsecurity modules nginx.conf opentracing.json owasp-modsecurity-crs template
www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$ cat nginx.conf
# A very simple nginx configuration file that forces nginx to start.
pid /tmp/nginx.pid;
events {}
http {}
daemon off;www-data@nginx-ingress-controller-f77bdf77b-2stkc:/etc/nginx$
好吧空空如也,屁都没有。。。
既然单个都不行,那么多个。。。
所以暂时还是先不例会吧。
那么按照原计划应该是在我们win11上面的hosts再增加
192.168.66.10 www2.atguigu.com
那么接下来正常流程应该是
[root@k8s-master01 ingress-vh]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.97.9.103 <none> 80:31014/TCP,443:31295/TCP 22h
就是31014在win11上面无论是www1.atguigu.com:31014还是www2.atguigu.com:31014都是应该可以访问成功的。
实则打脸。。。
另外一个就是可以查看目前的ingress列表了
[root@k8s-master01 ingress-vh]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
ingress1 www1.atguigu.com 80 10m
ingress2 www2.atguigu.com 80 10m
nginx-test www5.atguigu.com 80 22h
中间有个www5.atguigu.com这个也是我中间又做实验导致出来的。
可惜。。。
补充:中间有个yaml文件这里就不附了,反正也是失败。。。
关键字词:Service,Ingress