通过Spinnaker和Kayenta实现金丝雀发布-初始建立(本地Kubernetes)

首先

在Kubernetes的生态系统中,Spinnaker作为一个持续交付工具扮演着重要的角色。本次我们将在On-Prem环境的Kubernetes集群中,使用Spinnaker和Kayenta来实施金丝雀发布的方法进行验证。

环境信息

Kubernetes集群版本为1.11.3(已通过kubeadm进行构建)
Halyard引导机器为Ubuntu16.04
Halyard版本为1.10.1-20180912131447
Spinnaker版本为1.9.4

前提工作

准备安装 Halyard 使用的计算机设备。

Spinnaker有一个名为Halyard的安装工具。为了使用Spinnaker的所有功能,需要Halyard。在Ubuntu16.04上准备好适当的环境来安装Halyard。

安装 kubectl

需要在Halyard引擎上能执行kubectl命令。请下载kubectl二进制文件。

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

授予执行权限,并将其移至指定位置。

chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

将配置文件从 Kubernetes 主节点传输

mkdir ~/.kube
scp config sugi@10.44.67.25:/home/sugi/.kube/

进行确认

sugi@qicoo-halyard:~$ kubectl get nodes -o wide
NAME                 STATUS    ROLES     AGE       VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
qicoo-k8s-master01   Ready     master    1d        v1.11.3   10.44.67.21   <none>        Ubuntu 16.04.5 LTS   4.4.0-135-generic   docker://18.6.1
qicoo-k8s-node01     Ready     <none>    1d        v1.11.3   10.44.67.22   <none>        Ubuntu 16.04.5 LTS   4.4.0-135-generic   docker://18.6.1
qicoo-k8s-node02     Ready     <none>    1d        v1.11.3   10.44.67.23   <none>        Ubuntu 16.04.5 LTS   4.4.0-135-generic   docker://18.6.1

安装Minio

Spinnaker需要存储空间。它支持Azure存储、GCS、Redis、Minio和S3。我们选择Minio,因为它也可以在On-Prem环境中使用。

Minio将作为Kubernetes的部署选项进行引入。值得注意的是,在访问Minio时,Spinnaker需要指定主机名而不是IP地址进行访问(使用IP地址会导致错误)。

有不同的方法可以选择,但是我们可以在Kubernetes内部引入Minio,并通过ClusterIP进行名称解析来配置。

Minio会在Kubernetes中使用PVC。在开始之前需要进行准备工作。

通过创建并应用清单文件,可以启动Minio。

cat <<'EOF' > ~/manifests/minio.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: minio-pv-claim
  namespace: minio
  annotations:
    volume.kubernetes.io/storage-class: "nfs"
  labels:
    app: minio-storage-claim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  storageClassName: slow
  resources:
    requests:
      storage: 20Gi
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: minio-deployment
  namespace: minio
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        # Label is used as selector in the service.
        app: minio
    spec:
      # Refer to the PVC created earlier
      volumes:
      - name: storage
        persistentVolumeClaim:
          # Name of the PVC created earlier
          claimName: minio-pv-claim
      containers:
      - name: minio
        # Pulls the default Minio image from Docker Hub
        image: minio/minio
        args:
        - server
        - /storage
        env:
        # Minio access key and secret key
        - name: MINIO_ACCESS_KEY
          value: "Y2ADIFUQQQWXPEX9XP0I"
        - name: MINIO_SECRET_KEY
          value: "wY/9iXSzd3huAPAMd7+h0cDNYCxaLtkyp+cDjoMo"
        ports:
        - containerPort: 9000
        # Mount the volume into the pod
        volumeMounts:
        - name: storage # must match the volume name, above
          mountPath: "/storage"
---
apiVersion: v1
kind: Service
metadata:
  name: minio-service
  namespace: minio
spec:
  type: NodePort
  ports:
    - port: 9000
      targetPort: 9000
      nodePort: 32003
      protocol: TCP
  selector:
    app: minio
EOF
kubectl apply -f ~/manifests/minio.yaml

PrometheusOperator引入

使用Spinnaker进行金丝雀分析时,将根据指标进行分析。目前,以下三种类型的金丝雀分析得到支持。

    • Stackdriver (GCE)

 

    • Prometheus

 

    Datadog

本次我们将采用可以在本地使用的 Prometheus,创建一个在 Kubernetes 内部的 Prometheus。

git clone https://github.com/coreos/prometheus-operator.git
cd prometheus-operator/contrib/kube-prometheus
kubectl create -f manifests/ || true

将当前作为 ClusterIP 的 Prometheus 和 Grafana 更改为 NodePort 并进行公开。

root@qicoo-k8s-master01(monitoring kubernetes-admin):~/prometheus-operator/contrib/kube-prometheus/manifests# kubectl get svc
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
alertmanager-main       ClusterIP   10.110.255.240   <none>        9093/TCP            15m
alertmanager-operated   ClusterIP   None             <none>        9093/TCP,6783/TCP   8m
grafana                 ClusterIP   10.99.235.238    <none>        3000/TCP            15m
kube-state-metrics      ClusterIP   None             <none>        8443/TCP,9443/TCP   15m
node-exporter           ClusterIP   None             <none>        9100/TCP            14m
prometheus-k8s          ClusterIP   10.108.141.140   <none>        9090/TCP            14m
prometheus-operated     ClusterIP   None             <none>        9090/TCP            8m
prometheus-operator     ClusterIP   None             <none>        8080/TCP            15m

我会通过编辑进行修改。

kubectl edit -n monitoring svc prometheus-k8s
spec:
  clusterIP: 10.108.141.140
  ports:
  - name: web
    port: 9090
    protocol: TCP
    targetPort: web
    nodePort: 32292    <-- here
  selector:
    app: prometheus
    prometheus: k8s
  sessionAffinity: None
  type: NodePort    <-- here

我将使用edit进行编辑。

kubectl edit -n monitoring svc grafana
  ports:
  - name: http
    nodePort: 32036    <-- here
    port: 3000
    protocol: TCP
    targetPort: http
  selector:
    app: grafana
  sessionAffinity: None
  type: NodePort    <-- here

可以正常通过NodePort进行访问。

root@qicoo-k8s-master01(monitoring kubernetes-admin):~/prometheus-operator/contrib/kube-prometheus/manifests# kubectl get svc
NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
alertmanager-main       ClusterIP   10.110.255.240   <none>        9093/TCP            22m
alertmanager-operated   ClusterIP   None             <none>        9093/TCP,6783/TCP   15m
grafana                 NodePort    10.99.235.238    <none>        3000:32036/TCP      22m
kube-state-metrics      ClusterIP   None             <none>        8443/TCP,9443/TCP   22m
node-exporter           ClusterIP   None             <none>        9100/TCP            22m
prometheus-k8s          NodePort    10.108.141.140   <none>        9090:32292/TCP      22m
prometheus-operated     ClusterIP   None             <none>        9090/TCP            15m
prometheus-operator     ClusterIP   None             <none>        8080/TCP            22m

请确认访问 (根据各环境更改IP地址)
Prometheus
http://10.44.67.21:32292/graph

Grafana
http://10.44.67.21:32036/
管理员/管理员

建设Halyard

下载Halyard并运行Install ShellScript。

curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
sudo bash InstallHalyard.sh

实例演示

halyard/bin/halyard.bat
halyard/bin/hal
halyard/bin/halyard
hal
update-halyard
~
The halyard daemon isn't running yet... starting it manually...
1.10.1-20180912131447

Would you like to configure halyard to use bash auto-completion? [default=Y]: y
sugi@qicoo-halyard:~$ 

版本确认

sugi@qicoo-halyard:~$ hal -v
1.10.1-20180912131447

读取Bash的完整装载

. ~/.bashrc

Halyard的设置

云服务提供商

指定 Halyard 的部署提供者

hal config provider kubernetes enable

添加账户

hal config provider kubernetes account add kubernetes-admin \
    --provider-version v2 \
    --context $(kubectl config current-context)

激活文物

hal config features edit --artifacts true

环境

账户是用于kubectl指定用户名的选项。

hal config deploy edit --type distributed --account-name kubernetes-admin

外部存储

将minio的SECRET_KEY、ACCESS_KEY和ENDPOINT存入变量中。

MINIO_SECRET_KEY=wY/9iXSzd3huAPAMd7+h0cDNYCxaLtkyp+cDjoMo
MINIO_ACCESS_KEY=Y2ADIFUQQQWXPEX9XP0I
ENDPOINT=http://minio-service.minio.svc.cluster.local:9000/

将其设置为Halyard。

echo $MINIO_SECRET_KEY | hal config storage s3 edit --endpoint $ENDPOINT \
    --access-key-id $MINIO_ACCESS_KEY \
    --secret-access-key

将设置为使用s3(minio)。

hal config storage edit --type s3

由于Minio与S3不同无法进行版本控制,因此执行以下指定。

mkdir ~/.hal/default/profiles/
cat <<'EOF' > ~/.hal/default/profiles/front50-local.yml
spinnaker.s3.versioning: false
EOF

激活Slack通知

环境变量设置,例如token。

TOKEN_FROM_SLACK=himitu
SPINNAKER_BOT=SpinnakerBot
hal config notification slack enable
echo $TOKEN_FROM_SLACK | hal config notification slack edit --bot-name $SPINNAKER_BOT --token

设置使得可以访问GitHub。

为了让Halyard能够访问Spinnaker在GitHub上公开的Manifests文件,需要将GitHub的认证信息配置到Halyard中。

参考链接
https://www.spinnaker.io/setup/artifacts/github/

    • GitHub上でTokenを作成。Scopesはrepo配下全てを選択

 

    以下コマンドでfileを作成し、Halyardが読み込み可能な権限で配置しておく (/root配下などはNG)
TOKEN=himitu
mkdir ~/github_tokens
echo $TOKEN > ~/github_tokens/spinnaker_tutorial.txt

将变量设置为某个值。

TOKEN_FILE=~/github_tokens/spinnaker_tutorial.txt
ARTIFACT_ACCOUNT_NAME=Sugi275

在Halyard中配置使用Github的设置

hal config features edit --artifacts true
hal config artifact github enable

配置 Github 的 Artifact。注意,可以使用相同的名称进行多次注册。

hal config artifact github account add $ARTIFACT_ACCOUNT_NAME \
    --username Sugi275 \
    --password \
    --token

DockerHub的配置设置

设定变量

ADDRESS=index.docker.io
REPOSITORIES=sugimount/spin-kub-v2-demo
USERNAME=sugimount
PASSWORD=himitu
hal config provider docker-registry enable
echo $PASSWORD | hal config provider docker-registry account add sugimount \
    --address $ADDRESS \
    --repositories $REPOSITORIES \
    --username $USERNAME \
    --password

时区设置

可以从以下维基页面选择可用的时区:
https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

hal config edit --timezone Asia/Tokyo

引入Kayenta

启用Canary。由于需要使用Kayenta进行Canary分析,因此需要使用S3兼容的Minio存储。

因此,作为HAL,需要将 AWS 启用。

hal config canary enable
hal config canary aws enable

将canary config隐藏为全球可见。

hal config canary edit --show-all-configs-enabled false

将Minip的访问密钥ID等设置为变量。

MINIO_SECRET_KEY=wY/9iXSzd3huAPAMd7+h0cDNYCxaLtkyp+cDjoMo
MINIO_ACCESS_KEY=Y2ADIFUQQQWXPEX9XP0I
ENDPOINT=http://minio-service.minio.svc.cluster.local:9000/

在账户中增加

echo $MINIO_SECRET_KEY | hal config canary aws account add myawsaccount --bucket spin-bucket --access-key-id $MINIO_ACCESS_KEY --secret-access-key --endpoint $ENDPOINT

将存储账户设置为使用

hal config canary edit --default-storage-account myawsaccount

启用S3

hal config canary aws edit --s3-enabled true

指定 METRC 供应商

使用普罗米修斯

hal config canary edit --default-metrics-store prometheus
hal config canary prometheus enable
hal config canary prometheus account add my-canary-prometheus-account --base-url http://prometheus-k8s.monitoring.svc.cluster.local:9090
hal config canary edit --default-metrics-account my-canary-metrics-account

部署

检查Halyard中可部署的Spinnaker列表。

hal version list

请指定要用于安装的版本。

hal config version edit --version 1.9.4

部署Spinnaker

hal deploy apply

执行以下命令后,将在已安装Halyard的机器上设置SSH转发到localhost:9000和localhost:8084。

在Spinnaker的Deploy完成之后立即执行时可能会失败。

hal deploy connect

在浏览器中访问以下URL,即可打开Spinnaker的界面。

请删除Spinnaker备忘录。

使用Halyard,在希望再次进行Spinnaker部署时,可以使用以下命令从Kubernetes集群中删除Spinnaker。

hal deploy clean

请参考网址

哈利雅德
https://www.spinnaker.io/setup/install/halyard/

Minio
https://www.minio.io/
敏捷

Prometheus操作器(PrometheusOperator)是一个开源项目,可以在GitHub上找到其代码库:https://github.com/coreos/prometheus-operator

广告
将在 10 秒后关闭
bannerAds