前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >K8s 开始

K8s 开始

作者头像
GoCoding
发布于 2021-09-29 07:06:16
发布于 2021-09-29 07:06:16
1.6K00
代码可运行
举报
文章被收录于专栏:GoCodingGoCoding
运行总次数:0
代码可运行

Kubernetes[1] 是用于自动部署,扩展和管理容器化应用程序的开源系统。本文将介绍如何快速开始 K8s 的使用。

了解 K8s

  • Kubernetes / Overview[2]

搭建 K8s

本地开发测试,需要搭建一个 K8s 轻量服务。实际部署时,可以用云厂商的 K8s 服务。

本文以 k3d 为例,于 macOS 搭建 K8s 服务。于 Ubuntu 则推荐 MicroK8s。其他可替代方案有:

  • Kubernetes / Install Tools[3]
    • kind[4], minikube[5], kubeadm[6]
  • Docker Desktop / Deploy on Kubernetes[7]

k3d[8]

k3s[9] 是 Rancher 推出的 K8s 轻量版。而 k3d 即 k3s in docker,以 docker 容器管理 k3s 集群。

以下搭建过程,是于 macOS 的笔记,供参考。其他平台,请依照官方文档进行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 安装 kubectl: 命令行工具
brew install kubectl
# 安装 kubecm: 配置管理工具
brew install kubecm

# 安装 k3d
brew install k3d
❯ k3d version
k3d version v4.4.8
k3s version latest (default)

创建集群(1主2从):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ k3d cluster create mycluster --api-port 6550 --servers 1 --agents 2 --port 8080:80@loadbalancer --wait
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-mycluster' (23dc5761582b1a4b74d9aa64d8dca2256b5bc510c4580b3228123c26e93f456e)
INFO[0000] Created volume 'k3d-mycluster-images'
INFO[0001] Creating node 'k3d-mycluster-server-0'
INFO[0001] Creating node 'k3d-mycluster-agent-0'
INFO[0001] Creating node 'k3d-mycluster-agent-1'
INFO[0001] Creating LoadBalancer 'k3d-mycluster-serverlb'
INFO[0001] Starting cluster 'mycluster'
INFO[0001] Starting servers...
INFO[0001] Starting Node 'k3d-mycluster-server-0'
INFO[0009] Starting agents...
INFO[0009] Starting Node 'k3d-mycluster-agent-0'
INFO[0022] Starting Node 'k3d-mycluster-agent-1'
INFO[0030] Starting helpers...
INFO[0030] Starting Node 'k3d-mycluster-serverlb'
INFO[0031] (Optional) Trying to get IP of the docker host and inject it into the cluster as 'host.k3d.internal' for easy access
INFO[0036] Successfully added host record to /etc/hosts in 4/4 nodes and to the CoreDNS ConfigMap
INFO[0036] Cluster 'mycluster' created successfully!
INFO[0036] --kubeconfig-update-default=false --> sets --kubeconfig-switch-context=false
INFO[0036] You can now use it like this:
kubectl config use-context k3d-mycluster
kubectl cluster-info

查看集群信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ kubectl cluster-info
Kubernetes control plane is running at https://0.0.0.0:6550
CoreDNS is running at https://0.0.0.0:6550/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
Metrics-server is running at https://0.0.0.0:6550/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy

查看资源信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看 Nodes
❯ kubectl get nodes
NAME                     STATUS   ROLES                  AGE     VERSION
k3d-mycluster-agent-0    Ready    <none>                 2m12s   v1.20.10+k3s1
k3d-mycluster-server-0   Ready    control-plane,master   2m23s   v1.20.10+k3s1
k3d-mycluster-agent-1    Ready    <none>                 2m4s    v1.20.10+k3s1
# 查看 Pods
❯ kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   coredns-6488c6fcc6-5n7d9                  1/1     Running     0          2m12s
kube-system   metrics-server-86cbb8457f-dr7lh           1/1     Running     0          2m12s
kube-system   local-path-provisioner-5ff76fc89d-zbxf4   1/1     Running     0          2m12s
kube-system   helm-install-traefik-bfm4c                0/1     Completed   0          2m12s
kube-system   svclb-traefik-zx98g                       2/2     Running     0          68s
kube-system   svclb-traefik-7bx2r                       2/2     Running     0          68s
kube-system   svclb-traefik-cmdrm                       2/2     Running     0          68s
kube-system   traefik-6f9cbd9bd4-2mxhk                  1/1     Running     0          69s

测试 Nginx:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建 Nginx Deployment
kubectl create deployment nginx --image=nginx
# 创建 ClusterIP Service,暴露 Nginx 端口
kubectl create service clusterip nginx --tcp=80:80
# 创建 Ingress Object
#  k3s 以 traefik 为默认 ingress controller
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
EOF
# 访问 Nginx Service
#  kubectl get pods 确认 nginx STATUS=Running
open http://127.0.0.1:8080

测试 Dashboard:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建 Dashboard
GITHUB_URL=https://github.com/kubernetes/dashboard/releases
VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml
# 配置 RBAC
#  admin user
cat <<EOF > dashboard.admin-user.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
#  admin user role
cat <<EOF > dashboard.admin-user-role.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF
# 配置部署
kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml
# 获取 Bearer Token
kubectl -n kubernetes-dashboard describe secret admin-user-token | grep ^token
# 访问代理
kubectl proxy
# 访问 Dashboard
#  输入 Token 登录
open http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

删除集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
k3d cluster delete mycluster

切换集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubecm s

参考:

  • k3s / Dashboard[10]
  • k3d / Exposing Services[11]

MicroK8s[12]

MicroK8s 是 Ubuntu 官方生态提供的 K8s 轻量版,适合用于开发工作站、IoT、Edge、CI/CD。

以下搭建过程,是于 Ubuntu 18/20 的笔记,供参考。其他平台,请依照官方文档进行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 检查 hostname
#  要求不含大写字母和下划线,不然依照后文修改
hostname

# 安装 microk8s
sudo apt install snapd -y
snap info microk8s
sudo snap install microk8s --classic --channel=1.21/stable

# 添加用户组
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
newgrp microk8s
id $USER

## 一些确保拉到镜像的方法
# 配置代理(如果有)
#  MicroK8s / Installing behind a proxy
#   https://microk8s.io/docs/install-proxy
#  Issue: Pull images from others than k8s.gcr.io
#   https://github.com/ubuntu/microk8s/issues/472
sudo vi /var/snap/microk8s/current/args/containerd-env
  HTTPS_PROXY=http://127.0.0.1:7890
  NO_PROXY=10.1.0.0/16,10.152.183.0/24
# 添加镜像(docker.io)
#  镜像加速器
#   https://yeasy.gitbook.io/docker_practice/install/mirror
#  还可改 args/ 里不同模板的 sandbox_image
sudo vi /var/snap/microk8s/current/args/containerd-template.toml
  [plugins."io.containerd.grpc.v1.cri"]
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://x.mirror.aliyuncs.com", "https://registry-1.docker.io", ]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:32000"]
          endpoint = ["http://localhost:32000"]
# 手动导入,见后文启用插件那

# 重启服务
microk8s stop
microk8s start

检查状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ microk8s status
microk8s is running
high-availability: no
  datastore master nodes: 127.0.0.1:19001
  datastore standby nodes: none
addons:
  enabled:
    ha-cluster           # Configure high availability on the current node
  disabled:
    ambassador           # Ambassador API Gateway and Ingress
    cilium               # SDN, fast with full network policy
    dashboard            # The Kubernetes dashboard
    dns                  # CoreDNS
    fluentd              # Elasticsearch-Fluentd-Kibana logging and monitoring
    gpu                  # Automatic enablement of Nvidia CUDA
    helm                 # Helm 2 - the package manager for Kubernetes
    helm3                # Helm 3 - Kubernetes package manager
    host-access          # Allow Pods connecting to Host services smoothly
    ingress              # Ingress controller for external access
    istio                # Core Istio service mesh services
    jaeger               # Kubernetes Jaeger operator with its simple config
    keda                 # Kubernetes-based Event Driven Autoscaling
    knative              # The Knative framework on Kubernetes.
    kubeflow             # Kubeflow for easy ML deployments
    linkerd              # Linkerd is a service mesh for Kubernetes and other frameworks
    metallb              # Loadbalancer for your Kubernetes cluster
    metrics-server       # K8s Metrics Server for API access to service metrics
    multus               # Multus CNI enables attaching multiple network interfaces to pods
    openebs              # OpenEBS is the open-source storage solution for Kubernetes
    openfaas             # openfaas serverless framework
    portainer            # Portainer UI for your Kubernetes cluster
    prometheus           # Prometheus operator for monitoring and logging
    rbac                 # Role-Based Access Control for authorisation
    registry             # Private image registry exposed on localhost:32000
    storage              # Storage class; allocates storage from host directory
    traefik              # traefik Ingress controller for external access

如果 status 不正确时,可以如下排查错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
microk8s inspect
grep -r error /var/snap/microk8s/2346/inspection-report

如果要修改 hostname

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 改名称
sudo hostnamectl set-hostname ubuntu-vm
# 改 host
sudo vi /etc/hosts

# 云主机的话,还要改下配置
sudo vi /etc/cloud/cloud.cfg
  preserve_hostname: true
  # 如果只修改 preserve_hostname 不生效,那就直接注释掉 set/update_hostname
  cloud_init_modules:
  #  - set_hostname
  #  - update_hostname

# 重启,验证生效
sudo reboot

接着,启用些基础插件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
microk8s enable dns dashboard

# 查看 Pods ,确认 running
microk8s kubectl get pods --all-namespaces
# 不然,详情里看下错误原因
microk8s kubectl describe pod --all-namespaces

直到全部正常 running

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                         READY   STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-85fd7f45cb-snqrv        1/1     Running   1          15h
kube-system   dashboard-metrics-scraper-78d7698477-tmb7k   1/1     Running   1          15h
kube-system   metrics-server-8bbfb4bdb-wlf8g               1/1     Running   1          15h
kube-system   calico-node-p97kh                            1/1     Running   1          6m18s
kube-system   coredns-7f9c69c78c-255fg                     1/1     Running   1          15h
kube-system   calico-kube-controllers-f7868dd95-st9p7      1/1     Running   1          16h

如果拉取镜像失败,可以 microk8s ctr image pull <mirror>。或者,docker pull 后导入 containerd

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker save k8s.gcr.io/pause:3.1 > pause:3.1.tar
microk8s ctr image import pause:3.1.tar

docker pull calico/cni:v3.13.2
docker save calico/cni:v3.13.2 > cni:v3.13.2.tar
microk8s ctr image import cni:v3.13.2.tar

docker pull calico/node:v3.13.2
docker save calico/node:v3.13.2 > node:v3.13.2.tar
microk8s ctr image import node:v3.13.2.tar

如果 calico-node CrashLoopBackOff,可能网络配置问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查具体日志
microk8s kubectl logs -f -n kube-system calico-node-l5wl2 -c calico-node
# 如果有 Unable to auto-detect an IPv4 address,那么 ip a 找出哪个网口有 IP 。修改:
sudo vi /var/snap/microk8s/current/args/cni-network/cni.yaml
  - name: IP_AUTODETECTION_METHOD
  value: "interface=wlo.*"
# 重启服务
microk8s stop; microk8s start

## 参考
# Issue: Microk8s 1.19 not working on Ubuntu 20.04.1
#  https://github.com/ubuntu/microk8s/issues/1554
# Issue: CrashLoopBackOff for calico-node pods
#  https://github.com/projectcalico/calico/issues/3094
# Changing the pods CIDR in a MicroK8s cluster
#  https://microk8s.io/docs/change-cidr
# MicroK8s IPv6 DualStack HOW-TO
#  https://discuss.kubernetes.io/t/microk8s-ipv6-dualstack-how-to/14507

然后,可以打开 Dashboard 看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取 Token (未启用 RBAC 时)
token=$(microk8s kubectl -n kube-system get secret | grep default-token | cut -d " " -f1)
microk8s kubectl -n kube-system describe secret $token
# 转发端口
microk8s kubectl port-forward -n kube-system service/kubernetes-dashboard 10443:443
# 打开网页,输入 Token 登录
xdg-open https://127.0.0.1:10443

# 更多说明 https://microk8s.io/docs/addon-dashboard
# Issue: Your connection is not private
#  https://github.com/kubernetes/dashboard/issues/3804

更多操作,请阅读官方文档。本文之后仍以 k3d 为例。

准备 K8s 应用

Go 应用

http_server.go:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
 "fmt"
 "log"
 "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
 fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
 http.HandleFunc("/", handler)
 fmt.Println("HTTP Server running ...")
 log.Fatal(http.ListenAndServe(":3000", nil))
}

构建镜像

http_server.dockerfile:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM golang:1.17-alpine AS builder
WORKDIR /app
ADD ./http_server.go /app
RUN cd /app && go build http_server.go

FROM alpine:3.14
WORKDIR /app
COPY --from=builder /app/http_server /app/
EXPOSE 3000
ENTRYPOINT ./http_server
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 编译镜像
docker build -t http_server:1.0 -f http_server.dockerfile .
# 运行应用
docker run --rm -p 3000:3000 http_server:1.0
# 测试应用
❯ curl http://127.0.0.1:3000/go
Hi there, I love go!

部署 K8s 应用

了解概念

  • Kubernetes / Workloads[13]

之后,参照官方教程,我们将使用 Deployment 运行 Go 应用(无状态)。

导入镜像

首先,我们手动导入镜像进集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker save http_server:1.0 > http_server:1.0.tar
k3d image import http_server:1.0.tar -c mycluster

如果有自己的私有仓库,参见 k3d / Registries[14] 进行配置。

创建 Deployment

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 配置 Deployment (2个副本)
cat <<EOF > go-http-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-http
  labels:
    app: go-http
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-http
  template:
    metadata:
      labels:
        app: go-http
    spec:
      containers:
      - name: go-http
        image: http_server:1.0
        ports:
        - containerPort: 3000
EOF
# 应用 Deployment
#  --record: 记录命令
kubectl apply -f go-http-deployment.yaml --record

查看 Deployment:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看 Deployment
❯ kubectl get deploy
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
nginx     1/1     1            1           2d
go-http   2/2     2            2           22s

# 查看 Deployment 信息
kubectl describe deploy go-http
# 查看 Deployment 创建的 ReplicaSet (2个)
kubectl get rs
# 查看 Deployment 创建的 Pods (2个)
kubectl get po -l app=go-http -o wide --show-labels
# 查看某一 Pod 信息
kubectl describe po go-http-5848d49c7c-wzmxh
  • k8s / Deployments[15]

创建 Service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建 Service,名为 go-http
#  将请求代理到 app=go-http, tcp=3000 的 Pod 上
kubectl expose deployment go-http --name=go-http
# 或
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Service
metadata:
  name: go-http
  labels:
    app: go-http
spec:
  selector:
    app: go-http
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000
EOF

# 查看 Service
kubectl get svc
# 查看 Service 信息
kubectl describe svc go-http
# 查看 Endpoints 对比看看
#  kubectl get ep go-http
#  kubectl get po -l app=go-http -o wide

# 删除 Service (如果)
kubectl delete svc go-http

访问 Service (DNS):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ kubectl run curl --image=radial/busyboxplus:curl -i --tty

If you don't see a command prompt, try pressing enter.

[ root@curl:/ ]$ nslookup go-http
Server:    10.43.0.10
Address 1: 10.43.0.10 kube-dns.kube-system.svc.cluster.local

Name:      go-http
Address 1: 10.43.102.17 go-http.default.svc.cluster.local

[ root@curl:/ ]$ curl http://go-http:3000/go
Hi there, I love go!

暴露 Service (Ingress):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建 Ingress Object
cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: go-http
  annotations:
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /go
        pathType: Prefix
        backend:
          service:
            name: go-http
            port:
              number: 3000
EOF
# 查看 Ingress
kubectl get ingress
# 查看 Ingress 信息
kubectl describe ingress go-http

# 删除 Ingress (如果)
kubectl delete ingress go-http

访问 Service (Ingress):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ open http://127.0.0.1:8080/go
# 或,
❯ curl http://127.0.0.1:8080/go
Hi there, I love go!
# Nginx 是在 http://127.0.0.1:8080
  • k8s / Connecting Applications with Services[16]
  • k8s / Exposing an External IP Address[17]

更新

仅当 Deployment Pod 模板发生改变时,例如模板的标签或容器镜像被更新,才会触发 Deployment 上线。其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作。

所以,我们准备 http_server:2.0 镜像导入集群,然后更新:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ kubectl set image deployment/go-http go-http=http_server:2.0 --record
deployment.apps/go-http image updated

之后,可以查看上线状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看上线状态
❯ kubectl rollout status deployment/go-http
deployment "go-http" successfully rolled out

# 查看 ReplicaSet 状态:新的扩容,旧的缩容,完成更新
❯ kubectl get rs
NAME                 DESIRED   CURRENT   READY   AGE
go-http-586694b4f6   2         2         2       10s
go-http-5848d49c7c   0         0         0       6d

测试服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ curl http://127.0.0.1:8080/go
Hi there v2, I love go!

回滚

查看 Deployment 修订历史:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ kubectl rollout history deployment.v1.apps/go-http
deployment.apps/go-http
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=go-http-deployment.yaml --record=true
2         kubectl set image deployment/go-http go-http=http_server:2.0 --record=true

# 查看修订信息
kubectl rollout history deployment.v1.apps/go-http --revision=2

回滚到之前的修订版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 回滚到上一版
kubectl rollout undo deployment.v1.apps/go-http
# 回滚到指定版本
kubectl rollout undo deployment.v1.apps/go-http --to-revision=1

缩放

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 缩放 Deployment 的 ReplicaSet 数
kubectl scale deployment.v1.apps/go-http --replicas=10

# 如果集群启用了 Pod 的水平自动缩放,可以根据现有 Pods 的 CPU 利用率选择上下限
# Horizontal Pod Autoscaler Walkthrough
#  https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
kubectl autoscale deployment.v1.apps/nginx-deployment --min=10 --max=15 --cpu-percent=80

暂停、恢复

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 暂停 Deployment
kubectl rollout pause deployment.v1.apps/go-http
# 恢复 Deployment
kubectl rollout resume deployment.v1.apps/go-http

期间可以更新 Deployment ,但不会触发上线。

删除

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl delete deployment go-http

金丝雀部署

灰度部署,用多标签区分多个部署,新旧版可同时运行。部署新版时,用少量流量验证,没问题再全量更新。

  • k8s / Canary Deployments[18]

Helm[19] 发布

Helm 是 K8s 的包管理工具,包格式称为 charts。现在来发布我们的 Go 服务吧。

安装 Helm

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# macOS
brew install helm
# Ubuntu
sudo snap install helm --classic

执行 helm 了解命令。

创建 Chart

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
helm create go-http

查看内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ tree go-http -aF --dirsfirst
go-http
├── charts/     # 包依赖的 charts,称 subcharts
├── templates/  # 包的 K8s 文件模板,用的 Go 模板
│   ├── tests/
│   │   └── test-connection.yaml
│   ├── NOTES.txt       # 包的帮助文本
│   ├── _helpers.tpl    # 模板可重用的片段,模板里 include 引用
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   └── serviceaccount.yaml
├── .helmignore # 打包忽略说明
├── Chart.yaml  # 包的描述文件
└── values.yaml # 变量默认值,可安装时覆盖,模板里 .Values 引用

修改内容:

  • 修改 Chart.yaml 里的描述
    • 更多见 The Chart.yaml File[20]
  • 修改 values.yaml 里的变量
    • 修改 image 为发布的 Go 服务
    • 修改 ingresstrue,及一些配置
    • 删除 serviceAccount autoscalingtemplates/ 里也搜索删除相关内容
  • 修改 templates/ 里的模板
    • 删除 tests/,剩余 deployment.yaml service.yaml ingress.yaml 有用

结果可见 start-k8s/helm/go-http[21]

检查错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ helm lint --strict go-http
==> Linting go-http
[INFO] Chart.yaml: icon is recommended

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

渲染模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# --set 覆盖默认配置,或者用 -f 选择自定的 values.yaml
helm template go-http-helm ./go-http \
--set replicaCount=2 \
--set "ingress.hosts[0].paths[0].path=/helm" \
--set "ingress.hosts[0].paths[0].pathType=Prefix"

安装 Chart:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
helm install go-http-helm ./go-http \
--set replicaCount=2 \
--set "ingress.hosts[0].paths[0].path=/helm" \
--set "ingress.hosts[0].paths[0].pathType=Prefix"

# 或,打包后安装
helm package go-http
helm install go-http-helm go-http-1.0.0.tgz \
--set replicaCount=2 \
--set "ingress.hosts[0].paths[0].path=/helm" \
--set "ingress.hosts[0].paths[0].pathType=Prefix"

# 查看安装列表
helm list

测试服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
❯ kubectl get deploy go-http-helm
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
go-http-helm   2/2     2            2           2m42s

❯ curl http://127.0.0.1:8080/helm
Hi there, I love helm!

卸载 Chart:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
helm uninstall go-http-helm
  • Helm / Chart Template Guide[22]

发布 Chart

官方仓库 ArtifactHub[23] 上有很多分享的 Helm charts 。可见 velkoz1108/helm-chart[24] 把我们的 Go 服务发布到 Hub 上。

  • Helm / Chart Repository Guide[25]

最后

开始 K8s 吧!本文样例在 ikuokuo/start-k8s[26]

脚注

[1]

Kubernetes: https://kubernetes.io/

[2]

Kubernetes / Overview: https://kubernetes.io/docs/concepts/overview/

[3]

Kubernetes / Install Tools: https://kubernetes.io/docs/tasks/tools/

[4]

kind: https://kind.sigs.k8s.io/

[5]

minikube: https://minikube.sigs.k8s.io/

[6]

kubeadm: https://kubernetes.io/docs/reference/setup-tools/kubeadm/

[7]

Docker Desktop / Deploy on Kubernetes: https://docs.docker.com/desktop/kubernetes/

[8]

k3d: https://k3d.io/

[9]

k3s: https://github.com/k3s-io/k3s

[10]

k3s / Dashboard: https://rancher.com/docs/k3s/latest/en/installation/kube-dashboard/

[11]

k3d / Exposing Services: https://k3d.io/usage/guides/exposing_services/

[12]

MicroK8s: https://microk8s.io/

[13]

Kubernetes / Workloads: https://kubernetes.io/docs/concepts/workloads/

[14]

k3d / Registries: https://k3d.io/usage/guides/registries/

[15]

k8s / Deployments: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

[16]

k8s / Connecting Applications with Services: https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

[17]

k8s / Exposing an External IP Address: https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/

[18]

k8s / Canary Deployments: https://kubernetes.io/docs/concepts/cluster-administration/manage-deployment/#canary-deployments

[19]

Helm: https://helm.sh/

[20]

The Chart.yaml File: https://helm.sh/docs/topics/charts/#the-chartyaml-file

[21]

start-k8s/helm/go-http: https://github.com/ikuokuo/start-k8s/tree/main/helm/go-http

[22]

Helm / Chart Template Guide: https://helm.sh/docs/chart_template_guide/

[23]

ArtifactHub: https://artifacthub.io/

[24]

velkoz1108/helm-chart: https://github.com/velkoz1108/helm-chart

[25]

Helm / Chart Repository Guide: https://helm.sh/docs/topics/chart_repository/

[26]

ikuokuo/start-k8s: https://github.com/ikuokuo/start-k8s

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoCoding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
实体店生意不好做,小程序为线下门店经营解决哪些痛点?
如今实体店的运营成本越来越高,店面租金、人工成本、营销广告等成本逐年攀升,再加上互联网电商的冲击,门店客流少之又少,这给商家带来不小的压力,商家要做的就是想尽办法拓宽客流来源渠道,这样才有可能赚到钱。
得有店小程序
2020/04/17
1.4K0
干货|揭秘2020年最新的24招小程序运营玩法
小程序面世三年,在电商方面,为企业创造了超过100亿的gmv,而商家们该如何落地布局,抢占小程序电商红利呢?今天,新爷从我们服务过的众多商户中,总结出了24招高流量、高裂变、高转化、高复购的最新运营玩法,给电商企业以借鉴,让你赢在2020!
云店加小程序分享
2020/04/30
2.3K0
从0到57万,这个小程序是这样做到的!
以上例子都表明:营销活动设置的好,小程序才能快速吸引更多新用户。为了给广大客户提供更多案例,2018年6月29日下午,场景录培训部在腾讯众创空间开展了线下培训交流,本次培训的主题“渠道推广”,以场景录客户东西小屋为案例,为到场客户详细分析了小程序推广的方式。
场景录小程序
2018/07/03
3.6K0
从0到57万,这个小程序是这样做到的!
最全小程序电商玩法 18式!
小程序电商风头正劲,大有抢占平台电商的势头。面对流量红利,商家该如何抢占微信的社交流量,如何玩转小程序电商?本文将从裂变拉新,转化,留存 3 个角度共 36 个招式盘点最全的小程序玩法,助你玩转小程序电商。
用户1745481
2019/01/08
2.3K0
小程序风口已来,商家的财富自由之路,小程序来了,如何运营推广?
基于互联网、移动互联网创业的任何一个新平台,创业之初都是有流量红利的,抓住了流量红利也就占据了成本优势。今年年底之前,小程序的流量红利会随着获客成本的大幅上涨而消失,而小程序领域的资本都会向头部公司集中。
用户1745481
2019/01/09
8280
微信小程序运营和推广方法 新手如何快速上手去找新用户
微信小程序线上入口众多,且基于微信这个社交大平台,但对于一个专注线下的刚刚上线的实体店小程序,没有流量、没有用户,该如何去做推广呢? ​ 作为一个运营者或者商家来说,我们应该要怎么去运营小程序?其实小
速成应用小程序开发平台
2018/06/25
8660
干货|细数小程序裂变营销方式,让小程序每天涨粉1000人
在微信、抖音、百度、支付宝四大小程序平台中,微信小程序自带社交传播属性,无疑具有良好的裂变效果,可以用来快速积累粉丝和用户。但很多初创品牌和小企业使用微信小程序后却发现,由于缺乏品牌效应和种子用户,很难启动裂变活动。
云店加小程序分享
2020/05/15
2K0
独家:行业最全小程序功能组件分析报告出炉!
企鹅号小编
2017/12/27
3.5K0
独家:行业最全小程序功能组件分析报告出炉!
微信小程序的主流推广方式有哪些?
小程序推广的方法有很多,但据我观察最有效的还是裂变推广,对于拥有小程序的商家而言,小程序裂变是必须要掌握的推广方法。
微盛企微管家
2018/07/25
4.8K0
微信小程序的主流推广方式有哪些?
行业|小程序线上+线下打通区块链安全存储场景体验链
当下,随着线上线下融合不断加速,新一代的营销玩法趋于多样化。在消费升级和互联网+思维的双重影响下,各行通过结合小程序实现更多无限可能性。面对越来越多的选择,消费者对场景的需求、产品的要求也愈来愈高。能够拥抱变化,长期提供超预期体验的门店,正在抢占新一轮风口。来自北京的区块链资产安全解决品牌“库神钱包”正以转型升级之势实现多样化的市场运营。
微宝阁
2019/12/02
24.3K0
酒店小程序10种推广应用方式
酒店拥有小程序只是基础,能玩转小程序运营才是关键。本文将会简单讲述十种最实用的小程序推广策略,结合具体案例阐述酒店如何在拥有小程序后玩转小程序,快速实现小程序的推广。
用户1745481
2019/01/09
1.9K0
干货|小程序6招运营推广指南,教你做好小程序营销!
当用户第一次进入到了小程序的首页,如果小程序的首页简洁明了、美观清晰、能够让用户直观了解到你的核心的业务,那将是很大的加分项。因此小程序的首页列表需要逻辑清楚、分类恰当、页面美观整洁,图标符合主题,名称简短,让用户能够一目了然。这样用户才有心情继续浏览下去哦!
云店加小程序分享
2020/04/29
1.1K0
教你如何玩转微信小程序运营规划
其实对于小程序的定义很多人认为它是一个自带流量自带吸金属性的应用,对于微信来说,它是一个平台也是一个生态,整个互联网营销也会因为小程序的到来而不同,微信小程序是互联网以来最便捷的营销工具。
微宝阁
2018/07/09
1.7K0
教你如何玩转微信小程序运营规划
干货|小程序运营:教你如何快速营销获客!
随着获客成本越来越高,裂变用户对于所有行业来说是非常大的一个难题。在流量成本越来越贵的当下,小程序电商的获客成本几乎为零,成为商家收割下一波电商增量市场的重要利器。
云店加小程序分享
2020/04/14
1.3K0
小程序公开课 | 学会这些,你就知道如何推广小程序了!
社群分享主要有两种:一种是群小程序,另一种是聊天小程序。以卡片形式出现在微信聊天界面中,同时在聊天详情界面中也能找到小程序的日寇,点击后就能看见你与好友、群成员聊天里出现的小程序卡片,都会在这个列表里出现。
用户1745481
2019/01/09
5790
小程序推广的四大重要法则,裂变只排在第三!
小程序之所以被众多商家和企业重视,也是因为其易推广的特点。在流量成本如此高的情况下,小程序的低成本获客可以算是互联网的一股清流了。
用户1745481
2019/01/09
5420
案例 | 东鸽电器电商小程序,营销推广30天助力销售额突破30万!
在小程序无孔不入的当下,怎么利用小程序提高有效流量,最终实现从流量到销量的高效转化,成为各商家关注的重点。除了通过微信“搜一搜”、社交分享、扫码等小程序自然入口外,利用拼团、秒杀、砍价等营销工具,是商家们吸引流量、保持用户稳定的绝佳营销武器。
微盛企微管家
2019/07/27
9620
案例 | 东鸽电器电商小程序,营销推广30天助力销售额突破30万!
案例丨食品百货“维采”,利用微信小程序实现营业额稳步上涨
在互联网微信小程序越来越火热的情况下,很多门店选择了小程序. 生活中,也有很多常见的门店,奶茶店,咖啡馆,便利店,水果店等等。在互联网小程序越来越火热的情况下,都选择了微信小程序。
极客小程序分享
2019/01/07
9230
案例丨食品百货“维采”,利用微信小程序实现营业额稳步上涨
干货丨小程序和APP推广方式汇总
无论产品以怎样的形式落地,都少不了推广和营销环节,走向大众,是产品实现价值的最终表现。
齿轮易创说互联网
2018/09/30
3.1K0
干货丨小程序和APP推广方式汇总
小程序的下半场,如何用产品思维抓住最后的红利
在小程序起伏一年多后,惧怕错过红利和风口的投资人,开始出现集体“恐慌性投资”的现象,随着微信给小程序更多的入口和流量,B 端开发者数量的猛增,投资人已经开始疯狂布局,据阿拉丁《2018 上半年小程序生态白皮书》显示,80%一线基金入场,上半年进场投资资金超过 30 亿人民币,包括金沙江、红杉中国、险峰长青、IDG、真格基金等。在小程序的下半场,入局者如何将小程序融入自己的产业链,真正利用其优势实现企业增长呢?
齿轮易创说互联网
2018/12/05
8330
小程序的下半场,如何用产品思维抓住最后的红利
推荐阅读
相关推荐
实体店生意不好做,小程序为线下门店经营解决哪些痛点?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档