Kubernetes学习目录
1、基础知识
1.1、需求
在kubernetes平台上,我们在部署各种各样的应用服务的时候,可以基于手工或者自动的方式对各种资源对象实现伸缩操作,尤其是对于有状态的应用,
我们可以结合持久性存储机制实现更大场景的伸缩动作。
但是,无论我们怎么操作各种资源对象,问题最多的就是各种基础配置、镜像等之类的依赖管理操作。在linux平台下,常见的包依赖的就是yum、apt等工具,在kubernetes平台下,
同样有类似的解决依赖关系的工具 -- helm。
1.2、官方文档
官方网址:https://v3.helm.sh/
官方地址:https://github.com/helm/helm
官方仓库:https://hub.kubeapps.com/ 和 https://artifacthub.io/
最新版本:v3.11.3 | 20230413
1.3、Helm V2简介
1.3.1、Helm功能
helm的功能类似于yum 或 apt,提供应用部署时候所需要的各种配置、资源清单文件,他与yum之类工具不同的是,
在k8s中helm是不提供镜像的,这些镜像文件需要由专门的镜像仓库来提供。
1.3.2、Helm示例流程
例如:k8s平台上的nginx应用部署,对于该应用部署来说,主要需要三类内容:
1、镜像:nginx镜像
2、资源定义文件:Deployment、service、hpa等
3、专用文件:配置文件、证书等
helm管理的主要是:资源定义文件和专用文件。
1.3.3、Helm流程图
1.3.4、Tiller Server、Charts
Tiller Server是一个部署在Kubernetes集群内部的 server,其与 Helm client、Kubernetes API server 进行交互。
Tiller server 主要负责如下:
1、监听来自 Helm client 的请求
2、通过 chart 及其配置构建一次发布
3、安装 chart 到Kubernetes集群,并跟踪随后的发布
4、通过与Kubernetes交互升级或卸载 chart
简单的说,client 管理 charts,而 server 管理发布 release
1.3.5、流程解析
基于helm部署应用服务,完整的工作流程如下:
1、部署一个稳定运行的k8s集群,在能管理k8s的主机上部署helm。
2、用户在客户端主机上,定制各种Chart资源和config资源,上传到专用的仓库(本地或者远程)
3、helm客户端向Tiller发出部署请求,如果本地有chart用本地的,否则从仓库获取
4、Tiller与k8s集群的api-server发送请求
5、api-server通过集群内部机制部署应用,需要依赖镜像的时候,从专门的镜像仓库获取。
6、基于helm部署好的应用实例,在k8s集群中,我们称之为release。
1.3、Helm V3简介
1.3.1、v3简介
根据我们对 helm v2 版本的流程解析,我们发现,在客户端上部署tiller来维护 release相关的信息,有些太重量级了,
所以在 helm v3 版本的时候,就剔除了专门的Tiller。
根据我们之前对于flannel的理解,flannel的专用数据存储方式可以使用独立的etcd集群来进行数据的存储,也可以借助于apiservice方式将数据存储到etcd里面。所以helm借鉴与此,也可以通过apiserver来进行chart数据的存储,
包括运行出来的release信息,也借助于apiserver存储到etcd里面。
所以在 Helm v3 中移除了 Tiller, 版本相关的数据直接存储在了 Kubernetes 中
1.3.2、从v2到v3架构图
1.3.3、helm vs kustomize
Kustomize 只有一个 CLI 工具,在 Kubernetes 1.14 之后,甚至这唯一的工具也成为 kubectl 的一部分,可以说是很轻量级了。
Kustomize的特色
1、功能简单清晰,kubectl 直接支持。
2、不考虑派生,仅作为应用的 YAML 组织方式也很有帮助。
3、也有自己的插件系统。例如可以用简单的 YAML 定义,使用文件生成 Configmap/Secret。
通过上面对 kustomize 的讲解,可能已经有人注意到它与 Helm 有一定的相似。先来看看 Helm 的定位:Kubernetes 的包管理工具,
而 kustomize 的定位是:Kubernetes 原生配置管理。两者定位领域有很大不同,Helm 通过将应用抽象成 Chart 来管理, 专注于应用的操作、
复杂性管理等, 而kustomize 关注于 k8s API 对象的管理。
总的来说,Helm 有自己一套体系来管理应用,而kustomize更轻量级,融入Kubernetes的设计理念,通过原生 k8s API对象来管理应用。
1.3.4、helm vs operator
helm 仅仅是部署的功能。
operator 部署只是他的功能之一,他的核心功能是确保应用程序符合k8s的api的资源管理规范的基础上,通过代码级别的控制,确保应用能够按照用户所定义的期望状态进行执行。
2、Helm环境安装
2.1、软件安装
2.1.1、软件下载
wget https://get.helm.sh/helm-v3.11.3-linux-amd64.tar.gz
2.1.2、解压安装软件
tar xvf helm-v3.11.3-linux-amd64.tar.gz -C /usr/local/
mv /usr/local/linux-amd64 /usr/local/helm-v3.11.3
ln -s /usr/local/helm-v3.11.3 /usr/local/helm
mkdir /usr/local/helm/bin && mv /usr/local/helm/helm /usr/local/bin/
2.1.3、配置环境变量
cat > /etc/profile.d/helm-v3.11.3.sh <<EOF
#!/bin/bash
export HELM_HOME=/usr/local/helm
export PATH=$PATH:${HELM_HOME}/bin
EOF
chmod +x /etc/profile.d/helm-v3.11.3.sh
source /etc/profile
2.1.4、确认helm版本
]# helm version
version.BuildInfo{Version:"v3.11.3", GitCommit:"323249351482b3bbfc9f5004f65d400aa70f9ae7", GitTreeState:"clean", GoVersion:"go1.20.3"}
2.2、仓库配置
2.2.1、官方源配置
helm repo add brigade https://brigadecore.github.io/charts
# 查询仓库
]# helm repo list
NAME URL
brigade https://brigadecore.github.io/charts
]# helm search repo kash
NAME CHART VERSION APP VERSION DESCRIPTION
brigade/kashti 0.7.0 v0.4.0 A Helm chart for Kubernetes
2.2.2、第三方源配置
]# helm repo list
NAME URL
bitnami https://charts.bitnami.com/bitnami
prometheus-community https://prometheus-community.github.io/helm-charts
2.3、仓库管理
2.3.1、增加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
2.3.3、显示已配置的仓库
2.3.3、删除仓库
helm repo remove prometheus-community
2.3.4、更新仓库
2.3.5、仓库中查询charts
# 如查询redis
]# helm search repo redis
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/redis 17.9.3 7.0.10 Redis(R) is an open source, advanced key-value ...
bitnami/redis-cluster 8.4.3 7.0.10 Redis(R) is an open source, scalable, distribut...
2.4、helm显示管理
2.4.1、查看chart的信息
]# helm show chart bitnami/redis
annotations:
category: Database
licenses: Apache-2.0
apiVersion: v2
appVersion: 7.0.10
dependencies:
- name: common
repository: https://charts.bitnami.com/bitnami
tags:
- bitnami-common
version: 2.x.x
description: Redis(R) is an open source, advanced key-value store. It is often referred
to as a data structure server since keys can contain strings, hashes, lists, sets
and sorted sets.
home: https://github.com/bitnami/charts/tree/main/bitnami/redis
icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png
keywords:
- redis
- keyvalue
- database
maintainers:
- name: Bitnami
url: https://github.com/bitnami/charts
name: redis
sources:
- https://github.com/bitnami/containers/tree/main/bitnami/redis
version: 17.9.3
2.4.2、获取chart文件
helm pull bitnami/redis
# 拉到本地
]# ll redis-17.9.3.tgz
-rw-r--r-- 1 root root 90546 Apr 13 13:43 redis-17.9.3.tgz
2.4.3、helm show更多命令
]# helm show --help
...
Available Commands:
all show all information of the chart
chart show the chart's definition
crds show the chart's CRDs
readme show the chart's README
values show the chart's values
2.5、chart安装方式
2.5.1、本地安装chart
指定本地chart目录:helm install /path/to/chart_dir
指定本地chart压缩包:helm install chart_name.tgz
2.5.2、安装chart仓库中的chart
使用默认的远程仓库:helm install repo/chart_name
使用指定的仓库:helm install web_address:port/url/to/chart_name.tgz
注意:所谓的远程仓库,本质上是将打包后chart作为静态文件托管到了web服务器上。
3、使用helm部署redis-入门实践
3.1、首次需要更新一下repo
helm repo update
# 主要目标是为了创建缓存目录
~]# tree .cache/
.cache/
└── helm
└── repository
├── bitnami-charts.txt
└── bitnami-index.yaml
3.2、安装redis
3.2.1、安装redis-chart
# 注意helm名字不能为下划线
]# helm install my-helm-redis bitnami/redis
# 缓存已经下载好redis charts
~]# tree .cache/
.cache/
└── helm
└── repository
├── bitnami-charts.txt
├── bitnami-index.yaml
└── redis-17.9.3.tgz
3.2.2、安装后提示的解析
]# helm install my-helm-redis bitnami/redis
NAME: my-helm-redis
LAST DEPLOYED: Thu Apr 13 14:08:03 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis
CHART VERSION: 17.9.3
APP VERSION: 7.0.10
** Please be patient while the chart is being deployed **
#1、 redis主从的域名访问
my-helm-redis-master.default.svc.cluster.local for read/write operations (port 6379)
my-helm-redis-replicas.default.svc.cluster.local for read-only operations (port 6379)
#2、 获取运行的登陆密码
export REDIS_PASSWORD=$(kubectl get secret --namespace default my-helm-redis -o jsonpath="{.data.redis-password}" | base64 -d)
To connect to your Redis® server:
# 3、运行一个redis客户端
kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:7.0.10-debian-11-r4 --command -- sleep infinity
# 4、进入pod
kubectl exec --tty -i redis-client --namespace default -- bash
# 5、pod连接主从redis服务
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-master
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-replicas
# 6、要从集群外部连接到数据库,请执行以下命令
kubectl port-forward --namespace default svc/my-helm-redis-master 6379:6379 &
REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h 127.0.0.1 -p 6379
3.2.3、查询helm状态
]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-helm-redis default 1 2023-04-13 14:08:03.113305603 +0800 CST deployed redis-17.9.3 7.0.10
3.2.4、查询redis运行pod状态
]# kubectl get pod
NAME READY STATUS RESTARTS AGE
my-helm-redis-master-0 0/1 Pending 0 10m
my-helm-redis-replicas-0 0/1 Pending 0 10m
# 注意:此时pod挂起的,原因:持久化存储,没有配置共享盘。
3.3、缓存文件的解析
3.3.1、解压缓存文件并且查看
]# tar xvf .cache/helm/repository/redis-17.9.3.tgz -C /tmp/ && cd /tmp/redis
]# ll
total 208
-rw-r--r-- 1 root root 219 Apr 1 23:13 Chart.lock
drwxr-xr-x 3 root root 20 Apr 13 14:02 charts
-rw-r--r-- 1 root root 753 Apr 1 23:13 Chart.yaml
drwxr-xr-x 2 root root 66 Apr 13 14:23 img
-rw-r--r-- 1 root root 113678 Apr 1 23:13 README.md
drwxr-xr-x 5 root root 4096 Apr 13 14:23 templates
-rw-r--r-- 1 root root 4483 Apr 1 23:13 values.schema.json
-rw-r--r-- 1 root root 76003 Apr 1 23:13 values.yaml
3.3.2、文件解析
values.yaml 就是当前redis应用的各种属性的定制
redis]# vi values.yaml
## @section Global parameters
## Global Docker image parameters
## Please, note that this will override the image parameters, including dependencies, configured to use the global value
## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass
##
## @param global.imageRegistry Global Docker image registry
## @param global.imagePullSecrets Global Docker registry secret names as an array
## @param global.storageClass Global StorageClass for Persistent Volume(s)
## @param global.redis.password Global Redis® password (overrides `auth.password`)
##
global:
imageRegistry: ""
## E.g.
## imagePullSecrets:
## - myRegistryKeySecretName
##
imagePullSecrets: []
storageClass: ""
redis:
password: ""
## @section Common parameters
##
## @param kubeVersion Override Kubernetes version
##
kubeVersion: ""
## @param nameOverride String to partially override common.names.fullname
##
nameOverride: ""
## @param fullnameOverride String to fully override common.names.fullname
##
fullnameOverride: ""
## @param commonLabels Labels to add to all deployed objects
...
3.3.3、修改启动属性方式
1、可以通过 helm命令参数。
2、helm values.yaml文件的方式来进行操作。
3.4、Pod状态Pending的解决方法
3.4.1、原因
默认的持久化存储方式部署redis,我们没有配置共享存储的原因,下面先关闭它,再看看运行状态
3.4.2、删除redis helm
]# helm uninstall my-helm-redis
release "my-helm-redis" uninstalled
3.4.3、设置属性安装redis helm
helm install my-helm-redis bitnami/redis --set master.persistence.enabled=false --set replica.persistence.enabled=false
3.4.4、查询pod的运行状态
# 下载镜像中
~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-helm-redis-master-0 0/1 ContainerCreating 0 26s
my-helm-redis-replicas-0 0/1 ContainerCreating 0 26s
# redis已经运行成功
~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-helm-redis-master-0 0/1 Running 0 37s
my-helm-redis-replicas-0 0/1 Running 0 37s
3.5、连接redis测试
3.5.1、查询helm状态
# 如果不知道怎么链接,请看这个命令打印出来的教程
helm status my-helm-redis
3.5.2、获取redis登陆密码
export REDIS_PASSWORD=$(kubectl get secret --namespace default my-helm-redis -o jsonpath="{.data.redis-password}" | base64 -d)
]# echo $REDIS_PASSWORD
dDJW7k6Bem
3.5.3、创建redis-client的pod
kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:7.0.10-debian-11-r4 --command -- sleep infinity
# 注意:这里的密码是以环境变量传入pod中了
3.5.4、登陆redis进行数据读写
# 登陆master测试
$ REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-master
my-helm-redis-master:6379> set name cyc
my-helm-redis-master:6379> get name
"cyc"
my-helm-redis-master:6379> set age 18
my-helm-redis-master:6379> get age
"18"
# 登陆slave测试
$ REDISCLI_AUTH="$REDIS_PASSWORD" redis-cli -h my-helm-redis-replicas
my-helm-redis-replicas:6379> get age
"18"
my-helm-redis-replicas:6379> get name
"cyc"
3.6、通过values文件方式配置环境
3.6.1、修改values.yaml
cp /tmp/redis/values.yaml /tmp/redis/values.define.yaml
vi /tmp/redis/values.define.yaml
553 replica:
554 ## @param replica.replicaCount Number of Redis® replicas to deploy
555 ## 我们发现replicas默认是为3,现在把它修改为2
556 replicaCount: 2
557 ## @param replica.configuration Configuration for Redis® replicas nodes
558 ## ref: https://redis.io/topics/config
559 ##
560 configuration: ""
561 ## @param replica.disableCommands Array with Redis® commands to disable on replicas nodes
562 ## Commands will be completely disabled by renaming each to an empty string.
563 ## ref: https://redis.io/topics/security#disabling-of-specific-commands
564 ##
565 disableCommands:
566 - FLUSHDB
567 - FLUSHALL
3.6.2、安装redis并且使用修改好的配置文件
helm install my-helm-2-redis bitnami/redis -f /tmp/redis/values.define.yaml --set master.persistence.enabled=false --set replica.persistence.enabled=false
3.6.3、查询helm和pod运行状态
~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-helm-2-redis-master-0 1/1 Running 0 2m1s
my-helm-2-redis-replicas-0 1/1 Running 0 2m1s
my-helm-2-redis-replicas-1 1/1 Running 0 86s
~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-helm-2-redis default 1 2023-04-13 15:09:18.980635094 +0800 CST deployed redis-17.9.3 7.0.10