【云原生,k8s】基于Helm管理Kubernetes应用

第四阶段

时 间:2023年8月18日

参加人:全班人员

内 容:

基于Helm管理Kubernetes应用

目录

一、Kubernetes部署方式

(一)minikube

(二)二进制包

(三)Kubeadm

二、基于kubeadm部署K8S集群

(一)环境准备

(二)部署kubernetes集群

[(三)安装Dashboard UI](#(三)安装Dashboard UI)

(四)metrics-server服务部署

(五)Helm应用包管理器介绍

(六)Helm应用包管理器部署


一、 Kubernetes部署方式

官方提供Kubernetes部署3种方式

(一) minikube

Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

官方文档:Install Tools | Kubernetes

(二) 二进制包

从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。目前企业生产环境中主要使用该方式。

下载地址:

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.11.md#v1113

(三) Kubeadm

Kubeadm 是谷歌推出的一个专门用于快速部署 kubernetes 集群的工具。在集群部署的过程中,可以通过 kubeadm init 来初始化 master 节点,然后使用 kubeadm join 将其他的节点加入到集群中。

1、Kubeadm 通过简单配置可以快速将一个最小可用的集群运行起来。它在设计之初关注点是快速安装并将集群运行起来,而不是一步步关于各节点环境的准备工作。同样的,kubernetes 集群在使用过程中的各种插件也不是 kubeadm 关注的重点,比如 kubernetes集群 WEB Dashboard、prometheus 监控集群业务等。kubeadm 应用的目的是作为所有部署的基础,并通过 kubeadm 使得部署 kubernetes 集群更加容易。

2、 Kubeadm 的简单快捷的部署可以应用到如下三方面:

·新用户可以从 kubeadm 开始快速搭建 Kubernete 并了解。

·熟悉 Kubernetes 的用户可以使用 kubeadm 快速搭建集群并测试他们的应用。

·大型的项目可以将 kubeadm 配合其他的安装工具一起使用,形成一个比较复杂的系统。

·官方文档:

Kubeadm | Kubernetes
Installing kubeadm | Kubernetes

二、 基于kubeadm部署K8S集群

(一) 环境准备

|-----------------|------------|-----------------------------------|
| IP地址 | 主机名 | 组件 |
| 192.168.100.131 | k8s-master | kubeadm、kubelet、kubectl、docker-ce |
| 192.168.100.132 | k8s-node01 | kubeadm、kubelet、kubectl、docker-ce |
| 192.168.100.133 | k8s-node02 | kubeadm、kubelet、kubectl、docker-ce |

注意:所有主机配置推荐CPU:2C+ Memory:2G+

1 主机初始化配置

所有主机配置禁用防火墙和selinux

复制代码
[root@localhost ~]# setenforce 0

[root@localhost ~]# iptables -F

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# systemctl disable firewalld

[root@localhost ~]# systemctl stop NetworkManager

[root@localhost ~]# systemctl disable NetworkManager

[root@localhost ~]# sed -i '/^SELINUX=/s/enforcing/disabled/' /etc/selinux/config

2、 配置主机名并绑定hosts,不同主机名称不同

root@localhost \~# hostname k8s-master

root@localhost \~# bash

root@k8s-master \~# cat << EOF >> /etc/hosts

192.168.100.131 k8s-master

192.168.100.132 k8s-node01

192.168.100.133 k8s-node02

EOF

root@localhost \~# hostname k8s-node01

root@k8s-node01 \~# cat /etc/hosts

root@localhost \~# hostname k8s-node02

root@k8s-node02 \~#cat /etc/hosts

3、 主机配置初始化

root@k8s-master \~# yum -y install vim wget net-tools lrzsz

root@k8s-master \~# swapoff -a

root@k8s-master \~# sed -i '/swap/s/^/#/' /etc/fstab

root@k8s-master \~# cat << EOF >> /etc/sysctl.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

root@k8s-master \~# modprobe br_netfilter

root@k8s-master \~# sysctl -p

4、 部署docker环境

1) 三台主机上分别部署 Docker 环境,因为 Kubernetes 对容器的编排需要 Docker 的支持。

root@k8s-master \~# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

root@k8s-master \~# yum install -y yum-utils device-mapper-persistent-data lvm2

2) 使用 YUM 方式安装 Docker 时,推荐使用阿里的 YUM 源。

root@k8s-master \~# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3)清除缓存

root@k8s-master \~# yum clean all && yum makecache fast

4)启动docker

root@k8s-master \~# yum -y install docker-ce

root@k8s-master \~# systemctl start docker

root@k8s-master \~# systemctl enable docker

5) 镜像加速器(所有主机配置)

root@k8s-master \~# cat << END > /etc/docker/daemon.json

{ "registry-mirrors": "https://nyakyfun.mirror.aliyuncs.com"

}

END

6)重启docker

root@k8s-master \~# systemctl daemon-reload

root@k8s-master \~# systemctl restart docker

(二) 部署kubernetes集群

1、组件介绍

三个节点都需要安装下面三个组件

****kubeadm:****安装工具,使所有的组件都会以容器的方式运行

****kubectl:****客户端连接K8S API工具

kubelet:运行在node节点,用来启动容器的工具

2、配置阿里云yum源

使用 YUM 方式安装 Kubernetes时,推荐使用阿里的 YUM 源。

root@k8s-master \~# ls /etc/yum.repos.d/

root@k8s-master \~# cat > /etc/yum.repos.d/kubernetes.repo

3、安装kubelet kubeadm kubectl

所有主机配置

root@k8s-master \~# yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0

root@k8s-master \~# systemctl enable kubelet

root@k8s-master \~# kubectl version

kubelet 刚安装完成后,通过 systemctl start kubelet 方式是无法启动的,需要加入节点或初始化为 master 后才可启动成功。

4、配置init-config.yaml

Kubeadm 提供了很多配置项,Kubeadm 配置在 Kubernetes 集群中是存储在ConfigMap 中的,也可将这些配置写入配置文件,方便管理复杂的配置项。Kubeadm 配内容是通过 kubeadm config 命令写入配置文件的。

在master节点安装,master 定于为192.168.100.131,通过如下指令创建默认的init-config.yaml文件:

root@k8s-master \~# kubeadm config print init-defaults > init-config.yaml

init-config.yaml配置

root@k8s-master \~# cat init-config.yaml

5、安装master节点

1) 拉取所需镜像

root@k8s-master \~# kubeadm config images list --config init-config.yaml

root@k8s-master \~# kubeadm config images pull --config init-config.yaml

2) 安装matser节点

root@k8s-master \~# kubeadm init --config=init-config.yaml //初始化安装K8S

3) 根据提示操作

kubectl 默认会在执行的用户家目录下面的.kube 目录下寻找config 文件。这里是将在初始化时kubeconfig步骤生成的admin.conf 拷贝到.kube/config

root@k8s-master \~# mkdir -p $HOME/.kube

root@k8s-master \~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

root@k8s-master \~# chown (id -u):(id -g) $HOME/.kube/config

Kubeadm 通过初始化安装是不包括网络插件的,也就是说初始化之后是不具备相关网络功能的,比如 k8s-master 节点上查看节点信息都是"Not Ready"状态、Pod 的 CoreDNS无法提供服务等。

6、安装node节点

1) 根据master安装时的提示信息

root@k8s-node01 \~# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae

root@k8s-master \~# kubectl get nodes

root@k8s-node02 \~# kubeadm join 192.168.100.131:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:78bdd0f01660f4e84355b70aa8807cf1d0d6325b0b28502b29c241563e93b4ae

Master操作:

root@k8s-master \~# kubectl get nodes

前面已经提到,在初始化 k8s-master 时并没有网络相关配置,所以无法跟 node 节点通信,因此状态都是"NotReady"。但是通过 kubeadm join 加入的 node 节点已经在k8s-master 上可以看到。

7、安装flannel

Master 节点NotReady 的原因就是因为没有使用任何的网络插件,此时Node 和Master的连接还不正常。目前最流行的Kubernetes 网络插件有Flannel、Calico、Canal、Weave 这里选择使用flannel。

所有主机:

master上传kube-flannel.yml,所有主机上传flannel_v0.12.0-amd64.tar,cni-plugins-linux-amd64-v0.8.6.tgz

root@k8s-master \~# docker load < flannel_v0.12.0-amd64.tar

上传插件:

root@k8s-master \~# tar xf cni-plugins-linux-amd64-v0.8.6.tgz

root@k8s-master \~# cp flannel /opt/cni/bin/

master上传kube-flannel.yml

master主机配置:

root@k8s-master \~# kubectl apply -f kube-flannel.yml

root@k8s-master \~# kubectl get nodes

root@k8s-master \~# kubectl get pods -n kube-system

已经是ready状态

(三) 安装Dashboard UI

1、部署Dashboard

dashboard的github仓库地址:https://github.com/kubernetes/dashboard

代码仓库当中,有给出安装示例的相关部署文件,我们可以直接获取之后,直接部署即可

root@k8s-master \~# wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml

默认这个部署文件当中,会单独创建一个名为kubernetes-dashboard的命名空间,并将kubernetes-dashboard部署在该命名空间下。dashboard的镜像来自docker hub官方,所以可不用修改镜像地址,直接从官方获取即可。

2、开放端口设置

在默认情况下,dashboard并不对外开放访问端口,这里简化操作,直接使用nodePort的方式将其端口暴露出来,修改serivce部分的定义:

所有主机下载镜像

root@k8s-master \~# docker pull kubernetesui/dashboard:v2.0.0

root@k8s-master \~# docker pull kubernetesui/metrics-scraper:v1.0.4

root@k8s-master \~# vim recommended.yaml

3、权限配置

配置一个超级管理员权限

root@k8s-master \~# vim recommended.yaml

root@k8s-master \~# kubectl apply -f recommended.yaml

root@k8s-master \~# kubectl get pods -n kubernetes-dashboard

root@k8s-master \~# kubectl get pods -A -o wide

4、访问Token配置

使用谷歌浏览器测试访问 https://192.168.100.131:32443

可以看到出现如上图画面,需要我们输入一个kubeconfig文件或者一个token。事实上在安装dashboard时,也为我们默认创建好了一个serviceaccount,为kubernetes-dashboard,并为其生成好了token,

我们可以通过如下指令获取该sa的token:

root@k8s-master \~# kubectl describe secret -n kubernetes-dashboard (kubectl get secret -n kubernetes-dashboard \|grep kubernetes-dashboard-token \| awk '{print 1}') |grep token | awk '{print $2}'

输入获取的token

查看集群概况:

查看集群roles:

查看集群namespaces:

查看集群nodes:

查看集群pods:

(四) metrics-server服务部署

1、在Node节点上下载镜像

heapster已经被metrics-server取代,metrics-server是K8S中的资源指标获取工具

所有node节点上

root@k8s-node01 \~# docker pull bluersw/metrics-server-amd64:v0.3.6

root@k8s-node01 \~# docker tag bluersw/metrics-server-amd64:v0.3.6 k8s.gcr.io/metrics-server-amd64:v0.3.6

2、修改 Kubernetes apiserver 启动参数

在kube-apiserver项中添加如下配置选项 修改后apiserver会自动重启

root@k8s-master \~# vim /etc/kubernetes/manifests/kube-apiserver.yaml

3、Master上进行部署

root@k8s-master \~# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml

修改安装脚本:

root@k8s-master \~# vim components.yaml

root@k8s-master \~# kubectl create -f components.yaml

等待1-2分钟后查看结果

root@k8s-master \~# kubectl top nodes

再回到dashboard界面可以看到CPU和内存使用情况了

(五) Helm应用包管理器介绍

1、为什么需要Helm?

Kubernetes上部署的应用服务,都是由特定的资源描述组成,包括deployment、service等。每个资源对象都保存在各自文件中或者集中写到一个配置文件。然后通过kubectl apply --f demo.yaml命令进行部署。

如果业务系统只由一个或几个这样的服务组成,那么上面部署管理方式足够用了。

而对于一个复杂的业务系统,会有很多类似上面的资源描述文件,例如微服务架构应用,组成应用的服务可能多达十个,几十个。如果有更新或回滚应用的需求,可能要修改和维护所涉及的大量资源对象文件,而这种组织和管理应用的方式就显得力不从心了。

而且由于缺少对发布过的应用版本管理和控制,使Kubernetes上的应用维护和更新等面临诸多的挑战,主要面临以下问题:

如何将这些服务作为一个整体管理

这些资源文件如何高效复用

不支持应用级别的版本管理

2、Helm介绍

Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt-get等一样,Helm可以很方便的将之前打包好的yaml文件部署到kubernetes上。

Helm有3个重要概念:

****helm:****一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。

****Chart:****目录或者压缩包,用于应用描述,由一系列用于描述 k8s 资源对象相关文件的集合。

****Release:****基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在k8s中创建出真实运行的资源对象。

Helm特点

开发的一个用于kubernetes的包管理器,每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tar.gz格式的单一文件,方便传输和存储)

对于应用发布者而言,可以通过Helm打包应用, 管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用,

Helm提供了kubernetes上的软件部署,删除,升级, 回滚应用的强大功能

3、Helm V3变化

2019年11月13日, Helm团队发布 Helm v3的第一个稳定版本。该版本主要变化如下:

1)架构变化

最明显的变化是 Tiller的删除

2)Release名称可以在不同命名空间重用

3)支持将 Chart 推送至 Docker 镜像仓库Harbor中

4)使用JSONSchema验证chart values

5)其他

为了更好地协调其他包管理者的措辞 Helm CLI个别更名

helm delete` 更名为 `helm uninstall

helm inspect` 更名为 `helm show

helm fetch` 更名为 `helm pull

但以上旧的命令当前仍能使用。

移除了用于本地临时搭建 Chart Repository的 helm serve 命令。

自动创建名称空间

在不存在的命名空间中创建发行版时,Helm 2创建了命名空间。Helm 3遵循其他Kubernetes对象的行为,如果命名空间不存在则返回错误。

不再需要requirements.yaml, 依赖关系是直接在chart.yaml中定义。

(六) Helm应用包管理器部署

1、部署Helm客户端工具

Helm客户端下载地址:Releases · helm/helm · GitHub

将源码包解压并移动到/usr/bin/目录即可。

root@k8s-master \~# wget https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz

root@k8s-master \~# tar xf helm-v3.5.2-linux-amd64.tar.gz

root@k8s-master \~# cd linux-amd64/

root@k8s-master linux-amd64# ls

root@k8s-master linux-amd64# mv helm /usr/bin/

root@k8s-master \~# helm #验证helm命令是否可用

2、Helm常用命令

|------------|----------------------------------------------------------|
| 命令 | 描述 |
| create | 创建一个chart并指定名字 |
| dependency | 管理chart依赖 |
| get | 下载一个release。可用子命令:all、hooks、manifest、notes、values |
| history | 获取release历史 |
| install | 安装一个chart |
| list | 列出release |
| package | 将chart目录打包到chart存档文件中 |
| pull | 从远程仓库中下载chart并解压到本地 # helm pull stable/mysql --untar |
| repo | 添加,列出,移除,更新和索引chart仓库。可用子命令:add、index、list、remove、update |
| rollback | 从之前版本回滚 |
| search | 根据关键字搜索chart。可用子命令:hub、repo |
| show | 查看chart详细信息。可用子命令:all、chart、readme、values |
| status | 显示已命名版本的状态 |
| template | 本地呈现模板 |
| uninstall | 卸载一个release |
| upgrade | 更新一个release |
| version | 查看helm客户端版本 |

3、配置国内的Chart仓库

微软仓库(Index of /kubernetes/charts/)这个仓库强烈推荐,基本上官网有的chart这里都有。

阿里云仓库(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

官方仓库(Kubeapps | Home)官方chart仓库,国内有点不好使。

添加chart存储库

root@k8s-master \~# helm repo add stable http://mirror.azure.cn/kubernetes/charts

root@k8s-master \~# helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

root@k8s-master \~# helm repo update

查看已配置的chart存储库

root@k8s-master \~# helm repo list

删除存储库:

root@k8s-master \~# helm repo remove aliyun

root@k8s-master \~# helm repo list

4、使用chart部署一个Nginx应用

1) 创建chart

root@k8s-master \~# helm create nginx

root@k8s-master \~# tree nginx/

详解:

nginx/

├── charts #依赖其他包的charts文件

├── Chart.yaml #该chart的描述文件,包括ip地址,版本信息等

├── templates #存放k8s模板文件目录

│ ├── deployment.yaml #创建k8s deployment资源的yaml 模板

│ ├── _helpers.tpl #下划线开头的文件,可以被其他模板引用

│ ├── hpa.yaml #配置服务资源CPU 内存

│ ├── ingress.yaml # ingress 配合service域名访问的配置

│ ├── NOTES.txt #说明文件,helm install之后展示给用户看的内容

│ ├── serviceaccount.yaml

│ ├── service.yaml #kubernetes Serivce yaml模板

│ └── tests

│ └── test-connection.yaml

└── values.yaml #给模板文件使用的变量

2) 修改values.yaml 里的service的type为 NodePort

root@k8s-master \~# cd nginx/

root@k8s-master nginx# vim values.yaml

3) 安装chart任务(注意命令最后的点)

root@k8s-master nginx# helm install -f values.yaml

4) 查看release

root@k8s-master nginx# helm ls #或者helm list

5) 删除release

root@k8s-master nginx# helm delete nginx

6) 查看pod状态

root@k8s-master nginx# kubectl get pod

root@k8s-master nginx# kubectl get pod -o wide

7) 查看svc状态

root@k8s-master nginx# kubectl get svc

访问 192.168.100.132:30281

5、使用chart部署一个Tomcat应用

root@k8s-master \~# helm create tomcat

Creating tomcat

root@k8s-master \~# cd tomcat/

修改deployment.yaml和service.yaml文件

root@k8s-master tomcat# vim templates/deployment.yaml

root@k8s-master tomcat# vim templates/service.yaml

创建release

root@k8s-master tomcat# helm install tomcat .

查看release

root@k8s-master tomcat# helm ls

查看pod和svc

root@k8s-master tomcat# kubectl get pod

root@k8s-master tomcat# kubectl get pod -o wide

root@k8s-master tomcat# kubectl get svc

准备测试页

root@k8s-master tomcat# kubectl exec -it tomcat-67df6cd4d6-s7qxl /bin/bash

root@tomcat-67df6cd4d6-s7qxl:/usr/local/tomcat# mkdir webapps/ROOT

root@tomcat-67df6cd4d6-s7qxl:/usr/local/tomcat# echo "helm test1" > webapps/ROOT/index.jsp

root@k8s-master tomcat# kubectl exec -it tomcat-67df6cd4d6-tkp95 /bin/bash

root@tomcat-67df6cd4d6-tkp95:/usr/local/tomcat# mkdir webapps/ROOT

root@tomcat-67df6cd4d6-tkp95:/usr/local/tomcat# echo "helm test2" > webapps/ROOT/index.jsp

访问测试:

访问 192.168.100.132:32092

访问 192.168.100.133:32092

删除

root@k8s-master tomcat# helm delete tomcat

root@k8s-master tomcat# helm ls

升级(改完yaml文件之后重新应用)

root@k8s-master tomcat# helm install tomcat .

root@k8s-master tomcat# helm ls

root@k8s-master tomcat# kubectl get pod

root@k8s-master tomcat# vim templates/deployment.yaml

root@k8s-master tomcat# helm upgrade tomcat .

root@k8s-master tomcat# kubectl get pod

root@k8s-master tomcat# helm ls

回滚

root@k8s-master tomcat# helm rollback tomcat 1

root@k8s-master tomcat# helm ls

root@k8s-master tomcat# kubectl get pod

6、用变量渲染模板

测试模板是否正常

root@k8s-master tomcat# helm install --dry-run tomcat .

在values.yaml文件中定义变量

root@k8s-master tomcat# cat values.yaml

root@k8s-master tomcat# cat templates/deployment.yaml

root@k8s-master tomcat# cat templates/service.yaml

deployment.yamlservice.yaml两个文件的变量都是预先在values.yaml里面定义过引用过来的值。

Release.Name 代表helm install 后面的那个名字

root@k8s-master tomcat# helm delete tomcat

将templates目录中多余的文件都删除,只保留两个测试文件

root@k8s-master tomcat# ls templates/

root@k8s-master tomcat# helm install -f values.yaml

root@k8s-master tomcat# helm ls

查看发布状态

root@k8s-master tomcat# helm status tomcat

root@k8s-master tomcat# kubectl get pod

查看pod详细信息

root@k8s-master tomcat# kubectl describe pod tomcat-dp-67df6cd4d6-78pxc

相关推荐
Java识堂7 分钟前
如何对微服务进行拆分?
微服务·云原生·架构
某林2121 小时前
Isaac Sim 5.1.0 无头服务器部署与 RTX 显存段错误排障全记录
运维·服务器·docker·容器·isaac
m0_738120721 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
Plastic garden3 小时前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes
霸道流氓气质3 小时前
从MySQL到云原生:全面解析阿里云PolarDB数据库及其与MySQL的核心差异
数据库·mysql·云原生
木雷坞3 小时前
Playwright MCP Docker 部署:mcr 镜像、浏览器工具和权限配置
运维·docker·容器·mcp
暮云星影3 小时前
个人总结 docker搭建私人照片云相册Immich
docker·容器·arm
张忠琳3 小时前
【client-go v0.36.1】(store Part 1)Store 超深度分析 — 模块定位、接口层次、类结构、KeyFunc体系、构造初始化
云原生·kubernetes·informer·store·client-go
江湖有缘3 小时前
Docker一键部署open-resume简历生成器
运维·docker·容器