Helm及其他功能性组件

什么是 Helm

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂。helm 通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理

 

Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署

 

Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和release

  • chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说

明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包

  • release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成

一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release

 

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示

 

 

什么是 Helm

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂。helm 通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理

 

Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署

 

Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和release

  • chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说

明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包

  • release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成

一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release

 

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示

 

 

 

 

 

 

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互

 

 

注意:在Helm3中没有了Tiller!

 

Helm 部署

越来越多的公司和团队开始使用 Helm 这个 Kubernetes 的包管理器,我们也将使用 Helm 安装 Kubernetes 的常用组件。 Helm 由客户端命 helm 令行工具和服务端 tiller 组成,Helm 的安装十分简单。 下载 helm 命令行工具到master 节点 node1 的 /usr/local/bin 下,这里下载的 2.13. 1版本:

ntpdate ntp1.aliyun.com
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/

 

 

 

[root@k8s-master01 ~]# cd /usr/local/install-k8s/
[root@k8s-master01 install-k8s]# ls
cert  core  plugin
[root@k8s-master01 install-k8s]# mkdir helm

[root@k8s-master01 helm]# rz -E
rz waiting to receive.
[root@k8s-master01 helm]# ls
helm-v2.14.2-linux-amd64.tar.gz  helm-v2.14.2-linux-amd64.tar.gz.0
[[root@k8s-master01 helm]# tar -zxvf helm-v2.14.2-linux-amd64.tar.gz

[root@k8s-master01 helm]# cp -a linux-amd64/helm /usr/local/bin/
[root@k8s-master01 helm]# chmod a+x /usr/local/bin/helm
[root@k8s-master01 helm]#

 

为了安装服务端 tiller,还需要在这台机器上配置好 kubectl 工具和 kubeconfig 文件,确保 kubectl 工具可以在这台机器上访问 apiserver 且正常使用。 这里的 node1 节点以及配置好了 kubectl

 

因为 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。 详细内容可以查看helm文档中的 Role-based Access Control。 这里简单起见直接分配cluster- admin 这个集群内置的 ClusterRole 给它。创建 rbac-config.yaml 文件:


apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system

 

kubectl create -f rbac-config.yaml
 

helm init --service-account tiller --skip-refresh

 

我们初始化时报错:

[root@k8s-master01 helm]# helm init --service-account tiller --skip-refresh
$HELM_HOME has been configured at /root/.helm.
Error: error installing: the server could not find the requested resource (post deployments.extensions)

参考此博客解决

(42条消息) kubenetes1.16.0 安装helm报错与解决办法_dz45693的博客-CSDN博客

 

[root@k8s-master01 helm]# kubectl get pod -n kube-system
NAME                                   READY   STATUS             RESTARTS       AGE
coredns-6d8c4cb4d-dqwn8                1/1     Running            16 (12h ago)   17d
coredns-6d8c4cb4d-lx9c6                1/1     Running            16 (12h ago)   17d
etcd-k8s-master01                      1/1     Running            17 (12h ago)   17d
kube-apiserver-k8s-master01            1/1     Running            16 (12h ago)   17d
kube-controller-manager-k8s-master01   1/1     Running            16 (12h ago)   17d
kube-flannel-ds-22h2x                  1/1     Running            4 (12h ago)    2d
kube-flannel-ds-7c2gn                  1/1     Running            3 (12h ago)    2d
kube-flannel-ds-gcfpm                  1/1     Running            16 (12h ago)   17d
kube-proxy-ht4bl                       1/1     Running            15 (12h ago)   17d
kube-proxy-scjvz                       1/1     Running            16 (12h ago)   17d
kube-proxy-t68wn                       1/1     Running            15 (12h ago)   17d
kube-scheduler-k8s-master01            1/1     Running            16 (12h ago)   17d
tiller-deploy-9c4c59f49-qlrw2          0/1     ImagePullBackOff   0              2m3s

 

发现镜像下载失败,在每个节点上执行这两条命令,之后pod就running了!

 

 [root@k8s-node01 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2
v2.14.2: Pulling from google_containers/tiller
e7c96db7181b: Pull complete
c0dd79d56e9d: Pull complete
38dd4ab305dd: Pull complete
cf4c7ece0931: Pull complete
Digest: sha256:be79aff05025bd736f027eaf4a1b2716ac1e09b88e0e9493c962642519f19d9c
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2
registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2
[root@k8s-node01 ~]# docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.2 gcr.io/kubernetes-helm/tiller:v2.14.2
[root@k8s-node01 ~]#


 

 

tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下


kubectl get pod -n kube-system -l app=helm
NAME READY STATUS RESTARTS AGE
tiller-deploy-c4fd4cd68-dwkhv 1/1 Running 0 83s
helm version
Client: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",
GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.13.1", GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4",
GitTreeState:"clean"}

 

[root@k8s-master01 helm]# kubectl get pod -n kube-system -l app=helm
NAME                            READY   STATUS    RESTARTS   AGE
tiller-deploy-9c4c59f49-rbvbv   1/1     Running   0          59m
[root@k8s-master01 helm]#

 [root@k8s-master01 helm]# helm version(可以看到helm版本信息)
Client: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.14.2", GitCommit:"a8b13cc5ab6a7dbef0a58f5061bcc7c0c61598e7", GitTreeState:"clean"}
[root@k8s-master01 helm]#

 

 

Helm 自定义模板

 


# 创建文件夹
$ mkdir ./hello-world
$ cd ./hello-world

 


# 创建自描述文件 Chart.yaml , 这个文件必须有 name 和 version 定义
$ cat <<'EOF' > ./Chart.yaml
name: hello-world
version: 1.0.0
EOF

 

[root@k8s-master01 helm]# mkdir test
[root@k8s-master01 helm]# cd test/
[root@k8s-master01 test]#  cat <<'EOF' > ./Chart.yaml
> name: hello-world
> version: 1.0.0
> EOF
[root@k8s-master01 test]#

 

# 创建模板文件, 用于生成 Kubernetes 资源清单(manifests)
$ mkdir ./templates
$ cat <<'EOF' > ./templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
  selector:
    matchLabels
      app: hello-world
template:
  metadata:
    labels:
      app: hello-world
  spec:
    containers:
      - name: hello-world
        image: nginx
        ports:
          - containerPort: 80
            protocol: TCP
EOF
$ cat <<'EOF' > ./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 80
  targetPort: 80
  protocol: TCP
selector:
  app: hello-world
EOF

 


# 使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release
$ helm install

 

 [root@k8s-master01 test]# helm install .
Error: no available release name found
      这里会报错!

 

参考此博客

https://www.cnblogs.com/zypdbk/p/16500623.html

 

[root@k8s-master01 test]# helm install .(这时就可以看到描述信息了!)
NAME:   muddled-wolverine
LAST DEPLOYED: Thu Jul 21 08:45:25 2022
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME         READY  UP-TO-DATE  AVAILABLE  AGE
hello-world  0/1    0           0          0s

==> v1/Pod(related)
NAME                          READY  STATUS   RESTARTS  AGE
hello-world-758f99dbc7-jnpzw  0/1    Pending  0         0s

==> v1/Service
NAME         TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.106.182.159  <none>       80:32522/TCP  0s

 

 


# 列出已经部署的 Release
$ helm ls
# 查询一个特定的 Release 的状态
$ helm status RELEASE_NAME
# 移除所有与这个 Release 相关的 Kubernetes 资源
$ helm delete cautious-shrimp
# helm rollback RELEASE_NAME REVISION_NUMBER
$ helm rollback cautious-shrimp 1
# 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个
Release 的记录
$ helm delete --purge cautious-shrimp
$ helm ls --deleted

 


[root@k8s-master01 test]# helm list
NAME                  REVISION    UPDATED                     STATUS      CHART                APP VERSION    NAMESPACE
garish-kangaroo       1           Thu Jul 21 08:43:01 2022    FAILED      hello-world-1.0.0                   default  
illmannered-gerbil    1           Thu Jul 21 08:40:29 2022    FAILED      hello-world-1.0.0                   default  
invited-mule          1           Thu Jul 21 08:39:37 2022    FAILED      hello-world-1.0.0                   default  
kindled-pronghorn     1           Thu Jul 21 08:35:44 2022    FAILED      hello-world-1.0.0                   default  
muddled-wolverine     1           Thu Jul 21 08:45:25 2022    DEPLOYED    hello-world-1.0.0                   default  
singed-salamander     1           Thu Jul 21 08:45:17 2022    FAILED      hello-world-1.0.0                   default  
wrinkled-wombat       1           Thu Jul 21 08:42:47 2022    FAILED      hello-world-1.0.0                   default  

 

[root@k8s-master01 test]# vim templates/deployment.yaml
[root@k8s-master01 test]#

修改下nginx的版本

 

 

 

[root@k8s-master01 test]# helm upgrade muddled-wolverine .(更新一下)
Release "muddled-wolverine" has been upgraded.
LAST DEPLOYED: Thu Jul 21 09:05:26 2022
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME         READY  UP-TO-DATE  AVAILABLE  AGE
hello-world  1/1    1           1          20m

==> v1/Pod(related)
NAME                          READY  STATUS             RESTARTS  AGE
hello-world-758f99dbc7-jnpzw  1/1    Running            0         20m
hello-world-7cddc87856-ql8x6  0/1    ContainerCreating  0         0s

==> v1/Service
NAME         TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.106.182.159  <none>       80:32522/TCP  20m


[root@k8s-master01 test]# helm list(版本已经更新)
NAME                  REVISION    UPDATED                     STATUS      CHART                APP VERSION    NAMESPACE
garish-kangaroo       1           Thu Jul 21 08:43:01 2022    FAILED      hello-world-1.0.0                   default  
illmannered-gerbil    1           Thu Jul 21 08:40:29 2022    FAILED      hello-world-1.0.0                   default  
invited-mule          1           Thu Jul 21 08:39:37 2022    FAILED      hello-world-1.0.0                   default  
kindled-pronghorn     1           Thu Jul 21 08:35:44 2022    FAILED      hello-world-1.0.0                   default  
muddled-wolverine     2           Thu Jul 21 09:05:26 2022    DEPLOYED    hello-world-1.0.0                   default  
singed-salamander     1           Thu Jul 21 08:45:17 2022    FAILED      hello-world-1.0.0                   default  
wrinkled-wombat       1           Thu Jul 21 08:42:47 2022    FAILED      hello-world-1.0.0                   default  
[root@k8s-master01 test]#


[root@k8s-master01 test]# helm history muddled-wolverine(查看历史版本信息)
REVISION    UPDATED                     STATUS        CHART                DESCRIPTION     
1           Thu Jul 21 08:45:25 2022    SUPERSEDED    hello-world-1.0.0    Install complete
2           Thu Jul 21 09:05:26 2022    DEPLOYED      hello-world-1.0.0    Upgrade complete
[root@k8s-master01 test]#


[root@k8s-master01 test]# helm status muddled-wolverine (查看下状态)
LAST DEPLOYED: Thu Jul 21 09:05:26 2022
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME         READY  UP-TO-DATE  AVAILABLE  AGE
hello-world  1/1    1           1          24m

==> v1/Pod(related)
NAME                          READY  STATUS        RESTARTS  AGE
hello-world-758f99dbc7-jnpzw  1/1    Running       0         24m
hello-world-7cddc87856-ql8x6  0/1    ErrImagePull  0         3m59s(我们可以看到,镜像拉取失败)

==> v1/Service
NAME         TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.106.182.159  <none>       80:32522/TCP  24m(可以通过ip+端口来访问)

理解:

在docker里,我们是把一个应用程序打包为一个镜像,部署应用程序时运行镜像即可;

而k8s里的helm,我们是把集群的部署方案写入到Chart里,然后通过Chart生成一个集群,也就是Release!

 


# 配置体现在配置文件 values.yaml
$ cat <<'EOF' > ./values.yaml
image:
repository: nginx
tag: '1.14.0'
EOF

# 这个文件中定义的值,在模板文件中可以通过 .VAlues对象访问到
$ cat <<'EOF' > ./templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
  metadata:
    labels:
      app: hello-world
  spec:
    containers:
      - name: hello-world
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
          - containerPort: 8080
            protocol: TCP
EOF

 [root@k8s-master01 test]#  cat <<'EOF' > ./values.yaml
> image:
>   repository: nginx
>   tag: '1.14.0'
> EOF
[root@k8s-master01 test]# ls
Chart.yaml  templates  values.yaml

 [root@k8s-master01 test]# vim templates/deployment.yaml
[root@k8s-master01 test]#

 

 [root@k8s-master01 test]# helm upgrade muddled-wolverine .

 [root@k8s-master01 test]# kubectl get pod
NAME                           READY   STATUS    RESTARTS      AGE
hello-world-6649c5dbfc-5pqf5   1/1     Running   0             72s
myweb1-595fcc486f-2tmjn        1/1     Running   5 (24h ago)   3d10h
myweb1-595fcc486f-59gj4        1/1     Running   5 (24h ago)   3d10h
myweb1-595fcc486f-75rng        1/1     Running   5 (24h ago)   3d10h
myweb1-595fcc486f-dqwzf        1/1     Running   5 (24h ago)   3d10h
myweb1-595fcc486f-khfb5        1/1     Running   5 (24h ago)   3d10h
myweb1-595fcc486f-s2c9f        1/1     Running   5 (17m ago)   3d10h
myweb1-595fcc486f-s5dqd        1/1     Running   5 (17m ago)   3d10h
myweb1-595fcc486f-vhc2t        1/1     Running   5 (24h ago)   3d10h

 


# 在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set
key1=value1, key2=value2 覆盖掉
$ helm install --set image.tag='latest' .
# 升级版本
helm upgrade -f values.yaml test .

 

 

 [root@k8s-master01 test]# helm upgrade muddled-wolverine --set  image.tag='latest' .
Release "muddled-wolverine" has been upgraded.
LAST DEPLOYED: Fri Jul 22 10:21:09 2022
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME         READY  UP-TO-DATE  AVAILABLE  AGE
hello-world  1/1    0           1          25h

==> v1/Pod(related)
NAME                          READY  STATUS             RESTARTS  AGE
hello-world-6649c5dbfc-5pqf5  1/1    Running            0         8m53s
hello-world-7b647cdc98-qxr7j  0/1    ContainerCreating  0         0s

==> v1/Service
NAME         TYPE      CLUSTER-IP      EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.106.182.159  <none>       80:32522/TCP  25h



 [root@k8s-master01 test]# helm delete muddled-wolverine(删除release)
release "muddled-wolverine" deleted
[root@k8s-master01 test]# helm install --name muddled-wolverine(重新下载不成功。报错,已经存在)
Error: This command needs 1 argument: chart name
[root@k8s-master01 test]# helm install --name muddled-wolverine .
Error: a release named muddled-wolverine already exists.
Run: helm ls --all muddled-wolverine; to check the status of the release
Or run: helm del --purge muddled-wolverine; to delete it

[root@k8s-master01 test]# helm list --deleted(其实这里还是有的)
NAME                 REVISION    UPDATED                     STATUS     CHART                APP VERSION    NAMESPACE
muddled-wolverine    6           Fri Jul 22 10:21:09 2022    DELETED    hello-world-1.0.0                   default  

[root@k8s-master01 test]# helm rollback muddled-wolverine 6(回滚)
Rollback was a success.
[root@k8s-master01 test]# helm list
NAME                  REVISION    UPDATED                     STATUS      CHART                APP VERSION    NAMESPACE
muddled-wolverine     7           Fri Jul 22 10:30:35 2022    DEPLOYED    hello-world-1.0.0                   default 
[root@k8s-master01 test]#

[root@k8s-master01 test]# helm status muddled-wolverine
LAST DEPLOYED: Fri Jul 22 10:30:35 2022
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME         READY  UP-TO-DATE  AVAILABLE  AGE
hello-world  1/1    1           1          2m14s

==> v1/Pod(related)
NAME                          READY  STATUS   RESTARTS  AGE
hello-world-7b647cdc98-nfs76  1/1    Running  0         2m14s

==> v1/Service
NAME         TYPE      CLUSTER-IP     EXTERNAL-IP  PORT(S)       AGE
hello-world  NodePort  10.105.177.56  <none>       80:30573/TCP  2m14s


[root@k8s-master01 test]#



 

 

[root@k8s-master01 test]# helm delete --purge  muddled-wolverine (彻底删除)
release "muddled-wolverine" deleted
[root@k8s-master01 test]# helm list --deleted(这里为空!)
[root@k8s-master01 test]#

 

 

 

 

Debug

 


# 使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。
# 使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署
helm install . --dry-run --debug --set image.tag=latest

 

 [root@k8s-master01 test]# helm install --dry-run .(简单测试运行一下)
NAME:   trendsetting-sponge
[root@k8s-master01 test]# helm list(实际上并没有)
[root@k8s-master01 test]#

 

 

使用Helm部署 dashboard

 

kubernetes-dashboard.yaml:


image:
repository: k8s.gcr.io/kubernetes-dashboard-amd64
tag: v1.10.1
ingress:
enabled: true
hosts:
  - k8s.frognew.com
annotations:
  nginx.ingress.kubernetes.io/ssl-redirect: "true"
  nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
tls:
  - secretName: frognew-com-tls-secret
    hosts:
    - k8s.frognew.com
rbac:
clusterAdminRole: true

 


helm install stable/kubernetes-dashboard \
-n kubernetes-dashboard \
--namespace kube-system \
-f kubernetes-dashboard.yaml

 


kubectl -n kube-system get secret | grep kubernetes-dashboard-token

 

 

 [root@k8s-master01 dashboard]# helm fetch stable/kubernetes-dashboard(先下载一下)
Error: no cached repo found. (try 'helm repo update'). open /root/.helm/repository/cache/stable-index.yaml: no such file or directory(报错,需要更新仓库)

[root@k8s-master01 dashboard]# helm repo update(更新仓库)
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Unable to get an update from the "stable" chart repository (https://kubernetes-charts.storage.googleapis.com):
    Failed to fetch https://kubernetes-charts.storage.googleapis.com/index.yaml : 403 Forbidden
Update Complete.
         
[root@k8s-master01 dashboard]# helm fetch stable/kubernetes-dashboard(更新完之后还是不能下载)
Error: no cached repo found. (try 'helm repo update'). open /root/.helm/repository/cache/stable-index.yaml: no such file or directory
[root@k8s-master01 dashboard]# ls
[root@k8s-master01 dashboard]# helm repo add stable http://mirror.azure.cn/kubernetes/charts(执行这条命令)
"stable" has been added to your repositories
[root@k8s-master01 dashboard]# helm fetch stable/kubernetes-dashboard(这回就下载成功了)
[root@k8s-master01 dashboard]# ls
kubernetes-dashboard-1.11.1.tgz

[root@k8s-master01 dashboard]# tar -zxvf kubernetes-dashboard-1.11.1.tgz

 [root@k8s-master01 dashboard]# ls
kubernetes-dashboard  kubernetes-dashboard-1.11.1.tgz
[root@k8s-master01 dashboard]# cd kubernetes-dashboard/
[root@k8s-master01 kubernetes-dashboard]# ls
Chart.yaml  README.md  templates  values.yaml
[root@k8s-master01 kubernetes-dashboard]#

 

以上是不成功方案,解放方案如下:

[root@k8s-master01 dashboard]# helm repo add k8s-dashboard https://kubernetes.github.io/dashboard
[root@k8s-master01 dashboard]#  helm install k8s-dashboard/kubernetes-dashboard --version 2.6.0 -n k8s-dashboard --namespace kube-system

[root@k8s-master01 dashboard]# helm list
NAME             REVISION    UPDATED                     STATUS      CHART                         APP VERSION    NAMESPACE  
k8s-dashboard    1           Fri Jul 22 20:51:10 2022    DEPLOYED    kubernetes-dashboard-2.6.0    2.0.3          kube-system
[root@k8s-master01 dashboard]#


[root@k8s-master01 dashboard]# kubectl get pod -n kube-system
NAME                                                  READY   STATUS    RESTARTS       AGE
k8s-dashboard-kubernetes-dashboard-56d8995f77-64rrp   1/1     Running   0              4m5s
[root@k8s-master01 dashboard]#

[root@k8s-master01 dashboard]# kubectl get svc -n kube-system
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
k8s-dashboard-kubernetes-dashboard   ClusterIP   10.111.83.151   <none>        443/TCP                  7m15s
kube-dns                             ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   19d
tiller-deploy                        ClusterIP   10.100.223.87   <none>        44134/TCP                45h
[root@k8s-master01 dashboard]#

[root@k8s-master01 dashboard]# kubectl edit svc k8s-dashboard-kubernetes-dashboard -n kube-system(修改一下type类型,方便我们访问)
service/k8s-dashboard-kubernetes-dashboard edited
[root@k8s-master01 dashboard]#

 

 

 

[root@k8s-master01 dashboard]# kubectl get svc -n kube-system
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
k8s-dashboard-kubernetes-dashboard   NodePort    10.111.83.151   <none>        443:31996/TCP            10m
kube-dns                             ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP   19d
tiller-deploy                        ClusterIP   10.100.223.87   <none>        44134/TCP                45h
[root@k8s-master01 dashboard]#

 

我们输入ip地址:端口号访问一下:

(谷歌无法访问,使用火狐或者Edge浏览器访问!)

 

 

 

我们选择第一种访问:

 

[root@k8s-master01 dashboard]# kubectl -n kube-system get secret | grep kubernetes-dashboard-token
k8s-dashboard-kubernetes-dashboard-token-kwlpx   kubernetes.io/service-account-token   3      16m
[root@k8s-master01 dashboard]# kubectl describe secret k8s-dashboard-kubernetes-dashboard-token-kwlpx -n kube-system

 

 

 

 

我们进入后可以随意操作

 

 

 

 

 

 

 

 

 

 

 

 

使用Helm部署metrics-server

(由于 metrics-server已经包含在普罗米修斯里,所以这里我们不再部署了,直接关注普罗米修斯!

从 Heapster 的 github 中可以看到已经,heapster 已经DEPRECATED。这里是 heapster的deprecation timeline。 可以看出 heapster 从 Kubernetes 1.12 开始将从 Kubernetes 各种安装脚本中移除。Kubernetes 推荐使用 metrics-server。我们这里也使用helm来部署metrics-server。

 

metrics-server.yaml:

 


args:
- --logtostderr
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP

 

 


helm install stable/metrics-server \
-n metrics-server \
--namespace kube-system \
-f metrics-server.yaml

 

使用下面的命令可以获取到关于集群节点基本的指标信息:

 

kubectl top node

kubectl top pod --all-namespaces

 

部署Prometheus

 

相关地址信息

Prometheus github 地址:https://github.com/coreos/kube-prometheus

 

组件说明

  • MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如

kubectl,hpa,scheduler等。

  • PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。

  • NodeExporter:用于各node的关键度量指标状态数据。

  • KubeStateMetrics:收集kubernetes集群内资源对象数

据,制定告警规则。

  • Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数

据,通过http协议传输。

  • Grafana:是可视化数据统计和监控平台。

 

构建记录


git clone https://github.com/coreos/kube-prometheus.git
cd /root/kube-prometheus/manifests

 

[root@k8s-master01 ~]# cd /usr/local/install-k8s/plugin/
[root@k8s-master01 plugin]# mkdir prometheus
[root@k8s-master01 plugin]# cd prometheus/
[root@k8s-master01 prometheus]# git clone https://github.com/coreos/kube-prometheus.git

[root@k8s-master01 prometheus]# ls
kube-prometheus
[root@k8s-master01 prometheus]#  cd kube-prometheus/manifests/
[root@k8s-master01 manifests]#

 

 

修改 grafana-service.yaml 文件,使用 nodepode 方式访问 grafana:


vim grafana-service.yaml
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: monitoring
spec:
type: NodePort #添加内容
ports:
- name: http
  port: 3000
  targetPort: http
  nodePort: 30100 #添加内容
selector:
  app: grafana

 

修改 prometheus-service.yaml,改为 nodepode


vim prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
  prometheus: k8s
name: prometheus-k8s
namespace: monitoring
spec:
type: NodePort
ports:
- name: web
  port: 9090
  targetPort: web
  nodePort: 30200
selector:
  app: prometheus
  prometheus: k8s

 

修改 alertmanager-service.yaml,改为 nodepode


vim alertmanager-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
  alertmanager: main
name: alertmanager-main
namespace: monitoring
spec:
type: NodePort
ports:
- name: web
  port: 9093
  targetPort: web
  nodePort: 30300
selector:
  alertmanager: main
  app: alertmanager

[root@k8s-master01 manifests]# vim grafana-service.yaml
[root@k8s-master01 manifests]# vim prometheus-service.yaml
[root@k8s-master01 manifests]# vim alertmanager-service.yaml

 

 

[root@k8s-master01 prometheus]# pwd(把文件传输到此目录下)
/usr/local/install-k8s/plugin/prometheus

[root@k8s-master01 prometheus]# ls
kube-prometheus             load-images.sh  prometheus.tar.gz
kube-prometheus.git.tar.gz  prometheus(解压出来的)
[root@k8s-master01 prometheus]# mv prometheus load-images.sh /root/(移到root目录下)

[root@k8s-master01 prometheus]# cd
[root@k8s-master01 ~]# chmod a+x load-images.sh
[root@k8s-master01 ~]# ./load-images.sh

把这两个文件传输到其他node节点上
[root@k8s-master01 ~]# scp -r prometheus/ load-images.sh root@k8s-node01:/root/
[root@k8s-master01 ~]# scp -r prometheus/ load-images.sh root@k8s-node02:/root/



[root@k8s-master01 manifests]# kubectl apply -f ../manifests/

执行完之后我们会发现报错,多执行几遍

[root@k8s-master01 manifests]# kubectl apply -f ../manifests/setup/

 

 

之后会发现一直报这个错误:

error: unable to recognize "../manifests/prometheus-prometheus.yaml": no matches for kind "Prometheus" in version "v1"
[root@k8s-master01 manifests]#

 

 

 

Horizontal Pod Autoscaling

Horizontal Pod Autoscaling 可以根据 CPU 利用率自动伸缩一个 Replication Controller、Deployment 或者Replica Set 中的 Pod 数量


kubectl run php-apache --image=gcr.io/google_containers/hpa-example --requests=cpu=200m --expose
--port=80

 

创建 HPA 控制器 -

 


kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

 

增加负载,查看负载节点数目

 


$ kubectl run -i --tty load-generator --image=busybox /bin/sh
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done

 

资源限制 - Pod

Kubernetes 对资源的限制实际上是通过 cgroup 来控制的,cgroup 是容器的一组用来控制内核如何运行进程的相关属性集合。针对内存、CPU 和各种设备都有对应的 cgroup

默认情况下,Pod 运行没有 CPU 和内存的限额。 这意味着系统中的任何 Pod 将能够像执行该 Pod 所在的节点一样,消耗足够多的 CPU 和内存 。一般会针对某些应用的 pod 资源进行资源限制,这个资源限制是通过resources 的 requests 和 limits 来实现

 


spec:
    containers:
    - image: xxxx
      imagePullPolicy: Always
      name: auth
      ports:
      - containerPort: 8080
        protocol: TCP
      resources:
        limits:
          cpu: "4"
          memory: 2Gi
        requests:
          cpu: 250m
          memory: 250Mi

requests 要分分配的资源,limits 为最高请求的资源值。可以简单理解为初始值和最大值

 

资源限制 - 名称空间

 

计算资源配额

 


apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: spark-cluster
spec:
hard:
  pods: "20"
  requests.cpu: "20"
  requests.memory: 100Gi
  limits.cpu: "40"
  limits.memory: 200Gi

 

配置对象数量配额限制

 


apiVersion: v1
kind: ResourceQuota
metadata:
name: object-counts
namespace: spark-cluster
spec:
hard:
  configmaps: "10"
  persistentvolumeclaims: "4"
  replicationcontrollers: "20"
  secrets: "10"
  services: "10"
  services.loadbalancers: "2"

 

配置 CPU 和 内存 LimitRange

 


apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
    memory: 50Gi
    cpu: 5
  defaultRequest:
    memory: 1Gi
    cpu: 1
    type: Container

 

  • default 即 limit 的值

  • defaultRequest 即 request 的值

 

访问 prometheus

prometheus 对应的 nodeport 端口为 30200,访问 http://MasterIP:30200

 

 

通过访问 http://MasterIP:30200/target 可以看到 prometheus 已经成功连接上了 k8s 的 apiserver

 

查看 service-discovery

 

Prometheus 自己的指标

 

prometheus 的 WEB 界面上提供了基本的查询 K8S 集群中每个 POD 的 CPU 使用情况,查询条件如下:

 


sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

 

 

 

上述的查询有出现数据,说明 node-exporter 往 prometheus 中写入数据正常,接下来我们就可以部署grafana 组件,实现更友好的 webui 展示数据了

 

 

访问 grafana

查看 grafana 服务暴露的端口号:

 


kubectl get service -n monitoring | grep grafana

 

如上可以看到 grafana 的端口号是 30100,浏览器访问 http://MasterIP:30100 用户名密码默认 admin/admin

 

 

修改密码并登陆

 

 

添加数据源 grafana 默认已经添加了 Prometheus 数据源,grafana 支持多种时序数据源,每种数据源都有各自的查询编辑器

 

 

Prometheus 数据源的相关参数:

 

目前官方支持了如下几种数据源:

 

 

 

 

部署EFK平台

 

ELK是elasticsearch、logstatsh、kibana三种软件集成的日志搜集展示的框架,其中logstatsh是用于收集日志的软件,通常都会把它单放在其他服务器中,而elasticsearch与kibana可以放在一起,也可以分开放,elastivsearch是用来接受logstatsh传过来的日志文件,然后进行处理,处理完毕之后交给kibana进行一个网页的展示。

EFK是elasticsearch、logstatsh、kibana、zookeeper、kafka五种软件的集成,zookeeper、kafka使用来创建topic收集日志的仓库,当zookeeper、kafka配置好之后可以用创建好的topic用来收集想要的日志,zookeeper与kafka占用资源少、启动快、用起来方便、所以现在绝大多数公司都在使用EFK

 

 我们这里用ELK,但是L我们用fluentd  filebeat代替!

 

 

 

 

 

 

 

 

 

添加 Google incubator 仓库


helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
# 添加仓库
helm repo add incubator https://mirror.azure.cn/kubernetes/charts-incubator


 

部署 Elasticsearch


kubectl create namespace efk
helm fetch incubator/elasticsearch
helm install --name els1 --namespace=efk -f values.yaml
kubectl run cirror-$RANDOM --rm -it --image=cirros -- /bin/sh
curl Elasticsearch:Port/_cat/nodes

 

[root@k8s-master01 efk]# kubectl create namespace efk
namespace/efk created
[root@k8s-master01 efk]# rz -E
rz waiting to receive.

下载不了去这里手动下载,之后上传!

Index of /kubernetes/charts-incubator/ (azure.cn)


[root@k8s-master01 efk]# ls
elasticsearch-1.10.2.tgz
[root@k8s-master01 efk]# tar -zxvf elasticsearch-1.10.2.tgz

root@k8s-master01 efk]# cd elasticsearch/
[root@k8s-master01 elasticsearch]# ls
Chart.yaml  ci  README.md  templates  values.yaml
[root@k8s-master01 elasticsearch]# vim values.yaml (修改values.yaml文件)
[root@k8s-master01 elasticsearch]#

 

 

 

 

 

 

 

 

 

 

部署 Fluentd

 


helm fetch stable/fluentd-elasticsearch
vim values.yaml
# 更改其中 Elasticsearch 访问地址
helm install --name flu1 --namespace=efk -f values.yaml stable/fluentd-elasticsearch

 

 

部署 kibana

 


helm fetch stable/kibana --version 0.14.8
helm install --name kib1 --namespace=efk -f values.yaml stable/kibana --version 0.14.8

 

 

 



 



 

posted @ 2022-07-24 11:49  屯子里唯一的架构师  阅读(238)  评论(0编辑  收藏  举报