由Helm社区维护的一个名为Artifact Hub的Web应用,旨在便于Chart的共享与分发
https://artifacthub.io
helm 客户端
安装helm文档:https://helm.sh/docs/intro/install/
github地址:https://github.com/helm/helm/releases
wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz
tar -xf helm-v3.13.0-linux-amd64.tar.gz
root@k8s-master01:~/yaml# cd linux-amd64/
root@k8s-master01:~/yaml/linux-amd64# ls
LICENSE README.md helm
root@k8s-master01:~/yaml/linux-amd64# mv helm /usr/local/bin/
root@k8s-master01:~/yaml/linux-amd64# helm --help
tcpdump -i flannel.1 -nn -X tcp port 80
抓物理网卡
tcpdump -i eth0 -nn -X udp port 8472
添加仓库
root@k8s-master01:~# helm repo add bitnami https://charts.bitnami.com/bitnami
helm “bitnami” has been added to your repositories
helm repo add bitnami https://charts.bitnami.com/bitnami
root@k8s-master01:~# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnam
helm search repo mysql #搜索本地
helm search hub mysql #搜索hub仓库
helm pull bitnami/mysql #拉取到本地
部署mysql
参考
https://artifacthub.io/packages/helm/bitnami/mysql
helm install mysql \
--set auth.rootPassword=MageEdu \
--set global.storageClass=nfs-csi \
--set architecture=replication \
--set auth.database=wpdb \
--set auth.username=wpuser \
--set auth.password='magedu.com' \
--set secondary.replicaCount=1 \
--set auth.replicationPassword='replpass' \
bitnami/mysql \
-n blog
这个集群没有pv,需要创建动态pv
Warning FailedScheduling 2m50s (x2 over 8m6s) default-scheduler 0/6 nodes are available: 6 pod has unbound immediate PersistentVolumeClaims. preemption: 0/6 nodes are available: 6 Preemption is not helpful for scheduling.
在用动态pv的就能成功
root@server01:~/k8s/helm# kubectl get svc -n blog
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-primary ClusterIP 10.103.118.100 <none> 3306/TCP 5m52s
mysql-primary-headless ClusterIP None <none> 3306/TCP 5m52s
mysql-secondary ClusterIP 10.110.170.73 <none> 3306/TCP 5m52s
mysql-secondary-headless ClusterIP None <none> 3306/TCP 5m52s
root@server01:~/k8s/helm# kubectl get pods -n blog
NAME READY STATUS RESTARTS AGE
mysql-primary-0 1/1 Running 0 5m14s
mysql-secondary-0 1/1 Running 0 5m14s
root@server01:~/k8s/helm# kubectl get pvc -n blog
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysql-primary-0 Bound pvc-3ac60d48-66f3-4398-989d-3c761ae89a84 8Gi RWO nfs-csi 6m15s
data-mysql-secondary-0 Bound pvc-86c8cf8c-828e-4a69-91ed-10b14972e842 8Gi RWO nfs-csi 6m15s
root@server01:~/k8s/helm# helm list -n blog
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql blog 1 2023-10-11 20:56:56.410252673 +0800 CST deployed mysql-9.12.4 8.0
查看部署是的提示信息
helm status mysql -n blog
helm upgrade 更新 :跟helm install 一样,修改参数
helm rollback
release 回滚
更新,为mysql1主2从
helm upgrade mysql \
--set auth.rootPassword=MageEdu \
--set global.storageClass=nfs-csi \
--set architecture=replication \
--set auth.database=wpdb \
--set auth.username=wpuser \
--set auth.password='magedu.com' \
--set secondary.replicaCount=2 \
--set auth.replicationPassword='replpass' \
bitnami/mysql \
-n blog
删除helm资源
helm uninstall mysql -n blog
pv
root@k8s-master01:~/yaml/csi# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nginx 10Gi RWO Delete Bound default/pvc-nginx 69m
pvc-96139087-a1fc-4165-9431-5bd3235aef23 8Gi RWO Delete Bound blog/data-mysql2-secondary-0 nfs-csi 28m
pvc-b6bd6c95-478b-42b0-95c3-d0ea26362261 8Gi RWO Delete Bound blog/data-mysql2-primary-0 nfs-csi 28m
在 Kubernetes 中,`kubectl get pv` 是用于获取持久卷(Persistent Volume)的命令。持久卷是用于存储数据的资源,它们可以由集群管理员或者动态存储类(Dynamic Storage Class)提供。
`kubectl get pv` 命令的输出包含以下信息:
- **NAME**:持久卷的名称。
- **CAPACITY**:持久卷的容量。
- **ACCESS MODES**:持久卷的访问模式(例如:ReadWriteOnce,ReadOnlyMany,等等)。这些模式描述了持久卷可以被挂载和访问的方式。
- **RECLAIM POLICY**:持久卷的回收策略。这决定了当持久卷不再使用时的处理方式(例如:Retain,Delete,等等)。
- **STATUS**:持久卷的当前状态(例如:Available,Bound,Released,等等)。
- **CLAIM**:如果有的话,表示当前使用该持久卷的声明(即 PVC 名称)。
- **STORAGECLASS**:持久卷所属的存储类。存储类决定了根据需求创建持久卷时使用的存储方案。
- **REASON**:如果有的话,表示当前持久卷的状态改变的原因。
在 Kubernetes 中,持久卷声明(Persistent Volume Claim,PVC)是用于请求持久卷(Persistent Volume,PV)的抽象。PVC 定义了对存储资源的需求,并且负责在 PV 上绑定和释放卷。
每个 PV 都有一个回收策略(Retain、Delete、Recycle)。回收策略决定了当 PVC 与 PV 解绑时,系统对持久卷的处理方式。以下是回收策略的详解:
1. **Retain**(保留):当 PVC 与 PV 解绑时,持久卷不会被删除,而是被保留。需要手动处理保留的持久卷,例如手动删除或重新绑定到其他 PVC 上。这个回收策略适合于需要长期保留数据的情况。
2. **Delete**(删除):当 PVC 与 PV 解绑时(删除pvc后,pc会自动删除),持久卷会被立即删除。所有存储在该卷中的数据也将被永久删除。这个回收策略适合于需要每次解绑时删除数据的情况。
3. **Recycle**(回收):在 Kubernetes 1.14 版本之前已经废弃,不推荐使用。此策略在 PVC 与 PV 解绑时,会尝试删除卷中的数据,然后重新准备该卷供其他 PVC 使用。然而,这种回收方式并不可靠,并且依赖于存储提供商的实现。
请注意,回收策略是在 PV 创建时指定的,PVC 不能修改这个设置。因此,在创建 PV 时应谨慎选择回收策略,以确保符合数据保留和安全性要求。
部署wordpress
helm install wordpress --set mariadb.enabled=false --set externalDatabase.host=mysql-primary.blog.svc.cluster.local --set externalDatabase.user=wpuser --set externalDatabase.password='luohw.com' --set externalDatabase.database=wpdb --set externalDatabase.port=3306 --set persistence.storageClass=nfs-csi --set ingress.enabled=true --set ingress.ingressClassName=nginx --set ingress.hostname=blog.magedu.com --set ingress.pathType=Prefix --set wordpressUsername=admin --set wordpressPassword='luohw.com' bitnami/wordpress -n blog
查看
root@k8s-master01:~/helm/mysql# kubectl get pods -n blog
NAME READY STATUS RESTARTS AGE
mysql-primary-0 1/1 Running 0 18m
mysql-secondary-0 1/1 Running 1 (16m ago) 18m
wordpress-7fbfc75469-bxsp6 1/1 Running 0 14m
root@k8s-master01:~/helm/mysql# kubectl get svc -n blog
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-primary ClusterIP 10.100.245.69 <none> 3306/TCP 17m
mysql-primary-headless ClusterIP None <none> 3306/TCP 17m
mysql-secondary ClusterIP 10.108.118.144 <none> 3306/TCP 17m
mysql-secondary-headless ClusterIP None <none> 3306/TCP 17m
wordpress LoadBalancer 10.104.146.103 <pending> 80:30169/TCP,443:32382/TCP 13m
root@k8s-master01:~/helm/mysql# kubectl get pvc -n blog
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-mysql-primary-0 Bound pvc-46316af9-fe4f-44be-9118-44676a248e55 8Gi RWO nfs-csi 26m
data-mysql-secondary-0 Bound pvc-f97e9692-fd20-4c62-8374-8747da886305 8Gi RWO nfs-csi 26m
wordpress Bound pvc-941b05b3-ff6a-42c6-afd6-007fde9fd6c5 10Gi RWO nfs-csi 22m
windows 添加hosts解析,登录
访问http://blog.magedu.com/admin登录
删除
helm uninstall wordpress -n blog
部署habor
添加仓库
helm repo add harbor https://helm.goharbor.io
helm show values harbor/harbor
创建命名空间
kubectl create ns harbor
cd learning-k8s/helm-examples/harbor
helm install harbor -f ./harbor-values.yaml harbor/harbor -n harbor
cat harbor-values2.yaml
expose:
type: nodePort #如何公开服务:ingress、clusterIP、nodePort或loadBalancer,其他值将被忽略并跳过服务的创建
tls:
enabled: true
certSource: auto
auto:
commonName: luo #用于生成证书的通用名称,当类型不是ingress时需要此名称
ingress:
hosts:
core: hub.magedu.com
notary: notary.magedu.com
controller: default
annotations:
kubernetes.io/ingress.class: "nginx"
ipFamily:
ipv4:
enabled: true
ipv6:
enabled: false
externalURL: https://registry.magedu.com
# 持久化存储配置部分
persistence:
enabled: true
resourcePolicy: "keep"
persistentVolumeClaim: # 定义Harbor各个组件的PVC持久卷
registry: # registry组件(持久卷)
storageClass: "nfs-csi" # 前面创建的StorageClass,其它组件同样配置
accessMode: ReadWriteMany # 卷的访问模式,需要修改为ReadWriteMany
size: 5Gi
chartmuseum: # chartmuseum组件(持久卷)
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 5Gi
jobservice:
jobLog:
storageClass: "nfs-csi"
accessMode: ReadWriteOnce
size: 1Gi
#scanDataExports:
# storageClass: "nfs-csi"
# accessMode: ReadWriteOnce
# size: 1Gi
database: # PostgreSQl数据库组件
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 2Gi
redis: # Redis缓存组件
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 2Gi
trivy: # Trity漏洞扫描
storageClass: "nfs-csi"
accessMode: ReadWriteMany
size: 5Gi
harborAdminPassword: "abcdeg"
部署 helm install harbor -f ./harbor-values2.yaml harbor/harbor -n harbor
当yaml文件发生变化是使用helm upgrade 更新
helm upgrade harbor -f ./harbor-values2.yaml harbor/harbor -n harbor
root@server01:~/k8s/helm/learning-k8s/helm-examples/harbor# kubectl get svc -n harbor
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
harbor NodePort 10.97.35.42 <none> 80:30002/TCP,443:30003/TCP 90s
harbor-core ClusterIP 10.103.174.220 <none> 80/TCP 101m
harbor-database ClusterIP 10.99.144.75 <none> 5432/TCP 101m
harbor-jobservice ClusterIP 10.104.223.72 <none> 80/TCP 101m
harbor-portal ClusterIP 10.97.69.255 <none> 80/TCP 101m
harbor-redis ClusterIP 10.105.195.236 <none> 6379/TCP 101m
harbor-registry ClusterIP 10.104.241.84 <none> 5000/TCP,8080/TCP 101m
harbor-trivy ClusterIP 10.98.77.181 <none> 8080/TCP 101m
通过节点ip+nodeport访问
https://IP:30003/
删除
helm delete harbor -n harbor