kubernetes helm部署集群环境实战

本文用到的所有文件,公众号“云计算平台技术”内回复“helm实战”即可获取

镜像准备

1:编写一个简单的spring boot程序并打包(demo.jar),指定运行端口为8088
运行后即可通过浏览器访问http://localhost:8088

2:制作镜像:编写Dockerfile文件

FROM hub.c.163.com/library/java:8-alpine

ADD target/*.jar demo.jar

EXPOSE 8088

ENTRYPOINT ["java", "-jar", "/demo.jar"]

3:打包镜像

sudo docker build -t image_wpp .

4:运行镜像

// -d指定后台运行并将 8088端口映射到8089端口
sudo docker run -d -p 8089:8088 image_wpp

运行后即可通过浏览器访问http://localhost:8089

5:构建云镜像

可以在本地搭建harbor镜像仓库非常方便,也可以使用开源镜像仓库。

此处使用的是阿里容器镜像服务(网址)

// 构建云仓库,域名为你在阿里云设置的地址
sudo docker build -t registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp .
// 为镜像添加标签
sudo docker push registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest
// 登录 密码:Aaa081215.(供大家学习使用)
sudo docker login --username=a_17864308253 registry.cn-shanghai.aliyuncs.com
// 推送云镜像 
sudo docker push registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest

此时已经构建完成

// 获取镜像
sudo docker pull registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp:latest

k8s基本知识准备

安装

网上安装文章杂乱无章,而且大部分教程需要国外的网络环境。因此大部分初学者安装k8s环境要浪费大量时间。
最近开发了一款引擎系统只需登录网站,输入要安装的主机IP,用户名密码以及属性等信息即可完成自动化集群安装。由于服务器性能与带宽因素,不得不停止服务,后续如果开放服务将会在公众号内通知,大家可以关注本公众号获取关注动态。

不过在这里为大家准备了即使不用翻墙也能安装k8s的教程,大家可以点击链接尝试安装。

全网最简洁k8s安装方式传送门:

资源对象

由于k8s系统比较复杂,在这里仅仅介绍helm安装所用到的最小资源对象。
大家可以有个大致理解,想深入学习可以公众号回复"k8s学习"获取系统性的学习资料,也可在"k8s专辑内进行学习"。

资源对象在Kubernetes架构所处的位置

在这里插入图片描述

资源对象

Pod

Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。Pod代表部署的一个单位:Kubernetes中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。

Replication Controller

Controller 可以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。

Deployment

Deployment为Pod和Replica Set(升级版的 Replication Controller)提供声明式更新。

你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

Service

    Service 是对一组提供相同功能的 Pods 的抽象,并为它们提供一个统一的入口。借助 Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级。Service 通过标签来选取服务后端,一般配合 Replication Controller 或者 Deployment 来保证后端容器的正常运行。这些匹配标签的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。

Service 有四种类型:

  1. ClusterIP:默认类型,自动分配一个仅 cluster 内部可以访问的虚拟 IP
  2. NodePort:在 ClusterIP 基础上为 Service 在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务。如果 kube-proxy 设置了 –nodeport-addresses=10.240.0.0/16(v1.10 支持),那么仅该 NodePort 仅对设置在范围内的 IP 有效。
  3. LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort
  4. ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。

Helm学习

helm 目录结构

tree demochart

├── charts                       #  该目录中放置当前Chart依赖的其它Chart

├── Chart.yaml                   #  用于描述Chart的基本信息,包括名称版本等

├── templates                    #  部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值

│   ├── deployment.yaml         #   kubernetes Deployment object

│   ├── _helpers.tpl

│   ├── ingress.yaml

│   ├── NOTES.txt

│   └── service.yaml            #   kubernetes Serivce

└── values.yaml                  #  Chart的默认配置文件

helm 常用指令

添加仓库

helm repo add [name] [url]
例如:helm repo add k2 http://lib.paastest.nebulogy.com/charts

查看所有仓库

helm repo list
NAME    URL
stable  https://kubernetes-charts.storage.googleapis.com
local   http://127.0.0.1:8879/charts

更新仓库,如果向仓库中添加了chart 应用,必须更新 仓库

helm repo update

创建chart 应用

#  创建一个 demochart 应用, 默认从docker官方仓库 拉取nginx镜像,可以查看 values.yaml文件

helm create demochart

安装应用

cd demochart    # 切换到创建应用目录

helm install --name mynginx ./

# 查看应用是否运行
kubectl get pod

NAME                                 READY     STATUS    RESTARTS   AGE
mynginx-demochart-6f6788f898-lfzlc   1/1       Running   0          2m
# 查看mynginx Pod 对应的 service 
kubectl get svc

NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes          ClusterIP   10.68.0.1      <none>        443/TCP   16h
mynginx-demochart   ClusterIP   10.68.66.195   <none>        80/TCP    2m

# 访问mynginx 应用 (内部方法)
curl  10.68.66.195:80

打包应用

cd demochart

# 打包应用
helm package ./
Successfully packaged chart and saved it to: /root/appchart/demochart/demochart-0.1.0.tgz

应用升级

修改 chart.yaml 文件 ,将version版本从 0.1.0 ----》 0.2.0

cd demochart
vim Chart.yaml
    apiVersion: v1
    appVersion: "1.0"
    description: A Helm chart for Kubernetes
    name: demochart
    version: 0.2.0

# 打包应用
helm package ./

# 查询demochart版本
helm search demochart -l
NAME            CHART VERSION   APP VERSION DESCRIPTION               
local/demochart 0.2.0           1.0         A Helm chart for Kubernetes
local/demochart 0.1.0           1.0         A Helm chart for Kubernetes

# 升级demochart 应用
helm upgrade demochart local/demochart

# 查看demochart 历史版本
helm history demochart
REVISION    UPDATED                     STATUS      CHART           DESCRIPTION    

1           Wed Dec 12 19:08:39 2018    SUPERSEDED  demochart-0.1.0 Install complete
2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 Upgrade complet

helm list
NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
demochart   2           Wed Dec 12 19:12:48 2018    DEPLOYED    demochart-0.2.0 1.0         default

应用回滚

helm rollback [ReleaseName] [version]

例如:
      helm rollback mynginx  1

上次我们的CHART 版本使用的是:0.2.0
helm list

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
demochart   3           Wed Dec 12 19:20:45 2018    DEPLOYED    demochart-0.1.0 1.0         default 

应用删除

helm delete --purge [releaseName]

例如:
    helm delete --purge mynginx

helm实战

前提:确保能够掌握kubernetes基本编排文件编写。

准备:

# 查看是否 添加了仓库地址
[root@k8s-master /]#  cat /etc/docker/daemon.json
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver": "json-file",
    "log-opts": { "max-size" :"100m","max-file":"3" },
    "registry-mirrors": ["https://pqbap4ya.mirror.aliyuncs.com","https://registry.docker-cn.com"]
}

创建一个chart应用:

[root@k8s-master /]# helm create wppchart
[root@k8s-master /]# cd wppchart
[root@k8s-master wppchart]# ls
charts  Chart.yaml  templates  values.yaml

修改 value.yaml

# Default values for wppchart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
  # 修改处1:是不是很熟悉?这里修改为之前写的java系统打包后的镜像仓库地址
  repository: registry.cn-shanghai.aliyuncs.com/glodoncornerstone/image_wpp
  # 修改处2:镜像标签
  tag: latest
  pullPolicy: IfNotPresent

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

service:
  # 修改处3 service 访问方式  采用NodePort的方式端口暴露(NodePort简单)
  type: NodePort
  port: 80
  # 修改处4 集群对外暴露的端口
  nodePort: 30001

ingress:
  enabled: false
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: chart-example.local
      paths: []

  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local

resources: {}
  # We usually recommend not to specify default resources and to leave this as a conscious
  # choice for the user. This also increases chances charts run on environments with little
  # resources, such as Minikube. If you do want to specify resources, uncomment the following
  # lines, adjust them as necessary, and remove the curly braces after 'resources:'.
  # limits:
  #   cpu: 100m
  #   memory: 128Mi
  # requests:
  #   cpu: 100m
  #   memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}

修改 deployment.yaml 文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "wppchart.fullname" . }}
  labels:
{{ include "wppchart.labels" . | indent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ include "wppchart.name" . }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ include "wppchart.name" . }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
    {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
    {{- end }}
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
    {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
    {{- end }}

修改 service.yaml


apiVersion: v1
kind: Service
metadata:
  name: {{ include "wppchart.fullname" . }}
  labels:
{{ include "wppchart.labels" . | indent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: 8080
      nodePort: {{ .Values.service.nodePort }}
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: {{ include "wppchart.name" . }}
    app.kubernetes.io/instance: {{ .Release.Name }}

安装应用

现在要进行安装了,小白是不是很慌,怎么确保写的就是正确的
只需只需下面的指令检测是否有问题

[root@k8s-master templates]# helm lint
==> Skipping .
No chart found for linting (missing Chart.yaml)

Error: 0 chart(s) linted, 1 chart(s) failed

检测修改的chart yaml 文件是否正确

helm install --debug --dry-run --name wppchart ./

如果没有什么问题,则install安装应用

helm install --name wppchart ./

查看应用是否启动完成

# 查看集群中的pod资源
[root@k8s-master wppchart]# kubectl get pod
NAME                                  READY   STATUS    RESTARTS   AGE
wpp-chart-wppchart-7dfdbffcb7-nqwhb   1/1     Running   0          20h

# 查看应用详细信息
kubectl describe pod demo-chart-demoappchart-86765866bc-wd6zh

# 查看网络状态
[root@k8s-master wppchart]# kubectl get svc
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes           ClusterIP   10.96.0.1        <none>        443/TCP        25h
wpp-chart-wppchart   NodePort    10.110.236.113   <none>        80:30001/TCP   20h

PORT(S) [80:30001/TCP]代表已经将内部服务映射到集群外部服务,此时,我们可以访问任意一台节点IP:30001端口号便可以查看集群部署的java程序。

当然,你们是看不到这个结果的

在刚刚编写编排文件时,细心的小伙伴肯会有疑惑:我们的docker镜像暴露的端口号为8088.而kubernetes编排文件中从未出现此端口号,因此,我们回头检查修改的编排文件,只需把deployment.yaml中的containerPort与service.yaml中的targetPort改为8088重新执行"helm install --name wppchart ./"即可。修改多处是不是很麻烦?这时values.yaml的作用就发挥出来了,我们只需把这些变量定义在values.yaml即可。

发布了55 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/AAA17864308253/article/details/103285128