【helm是什么】helm官网:Helm
helm是kubernetes的包管理器,包管理器类似我们在ubuntu中使用的apt在centos中的yum一样,能够快速查找和下载资源包,helm由客户端组件helm和服务组件tiller组成,能够将一组众多分散的k8s资源打包统一管理,是查找共享和使用kubernets构建软件的最佳方式。
【部署helm】
https://get.helm.sh/helm-v3.2.0-linux-amd64.tar.gz
通过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 443/TCP 91m
zzz-ingress-nginx-controller LoadBalancer 10.96.47.177 80:8436/TCP,443:48276/TCP 16m
zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 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 80:30800/TCP,443:30443/TCP 8m6s
kubernetes ClusterIP 10.96.0.1 443/TCP 103m
zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 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 222/TCP 44s
ingress-out NodePort 10.96.187.67 80:30800/TCP,443:30443/TCP 24m
kubernetes ClusterIP 10.96.0.1 443/TCP 120m
zzz-ingress-nginx-controller-admission ClusterIP 10.96.19.21 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
zzz-ingress-nginx-controller-554c89857b-7kf7r 1/1 Running 0 51m 10.244.1.15 k8s-worker-node1
[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 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 ()
Rules:
Host Path Backends
---- ---- --------
www.aaa.com
/ back-service:222 (10.244.1.17:80)
Annotations:
Events:
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
发现配置已经成功被写入ingress-nginx控制器。然后修改客户机的hosts文件
添加www.aaa.com解析到kubernetes节点ip
最后访问测试
(ingress-nginx部署 - ning-cloud - 博客园)