通过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