helm部署ingress-nginx控制器
【helm是什么】helm官网:Helm
helm是kubernetes的包管理器,包管理器类似我们在ubuntu中使用的apt在centos中的yum一样,能够快速查找和下载资源包,helm由客户端组件helm和服务组件tiller组成,能够将一组众多分散的k8s资源打包统一管理,是查找共享和使用kubernets构建软件的最佳方式。
【部署helm】
通过kubeeasy部署工具一键部署,或是将helm可以执行的二进制文件放入/usr/bin并给予执行权限。
或是编译安装。
【配置helm部署服务所需环境】
进入helm官网查找ingress-nginx控制器

搜寻ingress-nginx控制器
根据自己的k8s版本进行选择。进入可以查看自己的k8s版本是否适配,这里使用的试kubeeasy工具部署的1.22.1的版本,1.18以上的版本基本适用,containerd底层容器除外,这里docker底。
这里使用是第一个(其实就是跟kubenetes官网用的镜像一样),然后添加helm仓库更新
[root@k8s-master-node1 ~]# helm repo list NAME URL nginx-ing https://kubernetes.github.io/ingress-nginx [root@k8s-master-node1 ~]# helm repo update Hang tight while we grab the latest from your chart repositories... ...Successfully got an update from the "nginx-ing" chart repository Update Complete. ⎈Happy Helming!⎈
【部署ingress-nginx控制器】
helm配置完成后可以开始部署控制器
这里先search一下看看有那些版本
[root@k8s-master-node1 ~]# helm search repo NAME CHART VERSION APP VERSION DESCRIPTION nginx-ing/ingress-nginx 4.4.0 1.5.1 Ingress controller for Kubernetes using NGINX a... [root@k8s-master-node1 ~]# helm install nginx-ing nginx-ing/ingress-nginx --version 4.4.0
这里有个很难搞的问题,这里拉取的镜像是国外的镜像,所以这里需要的镜像无法拉取。这里我用的解决方案是github+阿里云利用国外的镜像构建自己的镜像(实际上是同一个镜像只是重新构建了一遍),将镜像从阿里云pull至本地后tag给镜像打上需要的标签。拉取镜像参考:
这里启动一遍后describe查看一直在peding中的控制器,发现需要两个镜像,而且光是把镜像拉到本地更改标签是远远不够的,尽管将标签设置的一直仍然无法拉取镜像。后来发现镜像后面有一长串的附加的内容。而标签无法设置。

sha@~后面的内容无法设置

然后一直导致我无法拉取镜像。
这里直接helm pull将目标仓库的包直接拉取至本地。更改values文件,values用于填充chart中其他yaml的内容,直接搜索所有的image,将带有sha@所有内容注释掉。
#先添加别人的仓库文件。 [root@k8s-master-node1 git]# helm repo list NAME URL ooo https://kubernetes.github.io/ingress-nginx [root@k8s-master-node1 git]# helm search repo NAME CHART VERSION APP VERSION DESCRIPTION ooo/ingress-nginx 4.4.0 1.5.1 Ingress controller for Kubernetes using NGINX a... [root@k8s-master-node1 git]# helm pull ooo/ingress-nginx #将软件包pull至本地,然后将软件包解压,修改chart包内容,将values文件(用于生成资源文件信息。) #修改镜像标签和仓库。 [root@k8s-master-node1 docker]# tar -zxvf ingress-nginx-4.4.0.tgz [root@k8s-master-node1 docker]# cd ingress-nginx [root@k8s-master-node1 ingress-nginx]# vim values.yaml #digest: sha256:4ba73c697770664c1e00e9f968de14e08f606ff961c76e5d7033a4a9c593c629 #digestChroot: sha256:c1c091b88a6c936a83bd7b098662760a87868d12452529bad0d178fb36147345 #注释掉此处,然后最后再确认一遍所需镜像是否都有。
没有的镜像从阿里云构建海外镜像,拉取到本地,tag改标签。
#确认无误后直接开始部署即可。 [root@k8s-master-node1 ~]# ls anaconda-ks.cfg docker ingress-nginx-4.4.0.tgz mychart [root@k8s-master-node1 ~]# helm install zzz mychart/ …… [root@k8s-master-node1 ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION zzz default 1 2022-12-02 17:24:58.359675018 +0800 CST deployed ingress-nginx-4.4.0 1.5.1 [root@k8s-master-node1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE zzz-ingress-nginx-controller-554c89857b-7kf7r 1/1 Running 0 30s
发现服务全部启动完毕。
【测试ingress-nginx控制器】
查看service,是否暴露ingress-nginx控制器
[root@k8s-master-node1 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 91m zzz-ingress-nginx-controller LoadBalancer 10.96.47.177 <pending> 80:8436/TCP,443:48276/TCP 16m zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 <none> 443/TCP 16m
然后发现zzz-ingress-nginx-controller一直处于pending状态。这是因为helm默认部署是以LoadBalancer方式。这需要云厂商提供的平台支持,现在这里无法时候,可以自己创建service来进行测试。
这里先将默认的LoadBalancer删除,自行编写yaml文件连接ingress-nginx控制器。
[root@k8s-master-node1 ~]# vim server-out.yaml apiVersion: v1 kind: Service metadata: name: ingress-out annotations: meta.helm.sh/release-name: zzz meta.helm.sh/release-namespace: default spec: selector: app.kubernetes.io/component: controller app.kubernetes.io/instance: zzz app.kubernetes.io/name: ingress-nginx type: NodePort ports: - name: http port: 80 nodePort: 30800 - name: https port: 443 nodePort: 30443
这里nodePort暴露服务查看,是否可以连接到ingress-nginx控制器。
查看创建结果,这里describe看deployment控制器可以知道控制器标签和注解。然后发现endpoints和service都存在即可。
[root@k8s-master-node1 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-out NodePort 10.96.187.67 <none> 80:30800/TCP,443:30443/TCP 8m6s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 103m zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 <none> 443/TCP 28m [root@k8s-master-node1 ~]# kubectl get endpoints NAME ENDPOINTS AGE ingress-out 10.244.1.15:443,10.244.1.15:80 8m7s kubernetes 192.168.100.10:6443 103m zzz-ingress-nginx-controller-admission 10.244.1.15:8443 28m
发现ingress-out已经再暴露服务,然后访问测试。发现可以访问到nginx,因为还没有后端的应用,所以还是无主页的状态。

给worker节点打上标签,方便调度,根据自己的部署方式来搞。
[root@k8s-master-node1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master-node1 Ready control-plane,master,worker 111m v1.22.1 k8s-worker-node1 Ready worker 111m v1.22.1 [root@k8s-master-node1 ~]# kubectl label node k8s-worker-node1 node=node1 node/k8s-worker-node1 labeled #这里给其中一个节点打上标签,方便我后面限制调度的节点,因为我volume的方式嫌麻烦, #所以用了最简单的hostPath,当然想搞pvc也不是不行。
然后开始编写一个deploy模拟后端的应用。
[root@k8s-master-node1 ~]# kubectl apply -f backend.yaml deployment.apps/backend created [root@k8s-master-node1 ~]# cat backend.yaml apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: selector: matchLabels: app: back replicas: 1 strategy: type: Recreate template: metadata: name: backend-qwe labels: app: back spec: nodeSelector: node: node1 containers: - name: backend-container image: nginx:latest imagePullPolicy: IfNotPresent volumeMounts: - name: back-vol mountPath: /usr/share/nginx/html volumes: - name: back-vol hostPath: path: /ttt --- #这里顺便把内部的service也给部署了 apiVersion: v1 kind: Service metadata: name: back-service spec: selector: app: back ports: - port: 222 protocol: TCP targetPort: 80 [root@k8s-master-node1 ~]# kubectl apply -f backend.yaml deployment.apps/backend unchanged service/back-service unchanged [root@k8s-master-node1 ~]# kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE backend 1/1 1 1 3m11s zzz-ingress-nginx-controller 1/1 1 1 44m [root@k8s-master-node1 ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE back-service ClusterIP 10.96.195.12 <none> 222/TCP 44s ingress-out NodePort 10.96.187.67 <none> 80:30800/TCP,443:30443/TCP 24m kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 120m zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 <none> 443/TCP 44m
记得添加上index.html主页文件
[root@k8s-worker-node1 ~]# cd /ttt/ [root@k8s-worker-node1 ttt]# cat index.html this is test backend [root@k8s-master-node1 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES backend-6559ddb665-zknxv 1/1 Running 0 9m43s 10.244.1.17 k8s-worker-node1 <none> <none> zzz-ingress-nginx-controller-554c89857b-7kf7r 1/1 Running 0 51m 10.244.1.15 k8s-worker-node1 <none> <none> [root@k8s-master-node1 ~]# curl 10.244.1.17 this is test backend
然后编写yaml,部署ingress连接ingress-nginx和后端应用的内部service。
[root@k8s-master-node1 ~]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE ingress <none> www.aaa.com 80 4s [root@k8s-master-node1 ~]# cat ingress.yaml #新版本中已经弃用networking.k8s.io/v1beta1 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: nginx #一定要添加注解,否则无法被写入到ingress-nginx控制器当中。 spec: rules: - host: www.aaa.com http: paths: - pathType: Prefix path: / backend: service: name: back-service #内部的service port: number: 222 [root@k8s-master-node1 ~]# kubectl describe ingress ingress Name: ingress Namespace: default Address: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) Rules: Host Path Backends ---- ---- -------- www.aaa.com / back-service:222 (10.244.1.17:80) Annotations: <none> Events: <none>
pathType的Exact类型,是精准匹配url路径,并且区分大小写。
pathType的Prefix类型,是根据url中的/分割的前缀进行匹配
发现已经成功匹配到,然后进入ingress-nginx查看配置是否存在。(nginx ingress controller是一个反向代理程序)
[root@k8s-master-node1 ~]# kubectl exec zzz-ingress-nginx-controller-554c89857b-7kf7r cat /etc/nginx/nginx.conf|grep www kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. # See https://www.nginx.com/blog/websocket-nginx # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/ ## start server www.aaa.com server_name www.aaa.com ; # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/ ## end server www.aaa.com