Kubernetes (K8s)是我最喜欢的部署平台之一。我花了一个周末的时间在CI管道上连接集群。

先决条件

在我们开始之前,我们需要设置一些工具,比如在GKE中注册。许多其他工具只要支持k8,也可以做同样的事情。你可以随意使用其他选项,但要确保在你遵循这篇文章的时候调整你的设置。

撰写kubeconfig配置文件

让我们从设置k8集群开始。如果你已经有了,可以跳过这个。

gcloud container clusters create cluster-1 --zone europe-west3-a

创建一个临时文件夹来存储 kube config文件和任何其他内容。

# 环境变量
SERVICE_ACCOUNT_NAME=deployer
NAMESPACE=default
TARGET_FOLDER="/tmp/kube"
KUBECFG_FILE_NAME="${TARGET_FOLDER}/k8s-${SERVICE_ACCOUNT_NAME}-${NAMESPACE}-conf"

# 创建临时文件夹 
mkdir -p "/tmp/kube"

创建服务帐户并将其命名为部署者,最好限制只需要通过的权限。

kubectl create sa deployer --namespace default
kubectl create clusterrolebinding deployer --clusterrole cluster-admin --serviceaccount default:deployer

我们想要属于服务帐户的秘密,这个秘密带给我们获得证书和令牌。有个命令帮助我们。

SECRET_NAME=$(kubectl get sa deployer --namespace=default -o json | jq -r .secrets[].name)

# 将证书放入临时文件夹
kubectl get secret --namespace default "${SECRET_NAME}" -o json | jq \
    -r '.data["ca.crt"]' | base64 --decode  > "tmp/kube/ca.crt"

# 提取并声明用户令牌
USER_TOKEN=$(kubectl get secret --namespace default "${SECRET_NAME}" -o json | jq -r '.data["token"]' | base64 --decode)

然后我们可以使用上面的信息设置 kube config 配置文件,如证书、令牌等。最终我们应该有一个具有相应值的 kube config 配置文件,以允许我们的代理 docker 容器连接到 K8s。

CONTEXT=$(kubectl config current-context)

CLUSTER_NAME=$(kubectl config get-contexts "${CONTEXT}" | awk '{print $3}' | tail -n 1)

ENDPOINT=$(kubectl config view \
    -o jsonpath="{.clusters[?(@.name == \"${CLUSTER_NAME}\")].cluster.server}")

# 在 kube config 配置中设置集群
kubectl config set-cluster "${CLUSTER_NAME}" \
    --kubeconfig="${KUBECFG_FILE_NAME}" \
    --server="${ENDPOINT}" \
    --certificate-authority="${TARGET_FOLDER}/ca.crt" \
    --embed-certs=true

# 在 kube config中设置令牌凭据 
kubectl config set-credentials \
    deployer-default-${CLUSTER_NAME}" \
    --kubeconfig=/tmp/kube/kube-conf \
    --token="${USER_TOKEN}"

# 在 kube config 中设置上下文
kubectl config set-context \
    "deployer-default-${CLUSTER_NAME}" \
    --kubeconfig=/tmp/kube/kube-conf \
    --cluster="${CLUSTER_NAME}" \
    --user="deployer-default-${CLUSTER_NAME}" \
    --namespace=default

# 在 kube config 中使用上下文
kubectl config use-context "deployer-default-${CLUSTER_NAME}" \
    --kubeconfig=/tmp/kube/kube-conf

我们可以在此路径中找到 kube 配置文件:/tmp/kube/。

# kube config 配置文件示例
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: BASE64_CA_CERT
    server: https://YOUR_API_IP
  name: k8s
contexts:
- context:
    cluster: k8s
    user: k8s-deployer
  name: k8s
current-context: k8s
kind: Config
preferences: {}
users:
- name: k8s-deployer
  user:
    token: BASE64_TOKEN

最后但同样重要的是,我们必须为服务帐户授予基于角色的访问控制权限并创建 permissions-template.yaml

# permissions-template.yaml
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: my_account-clusterrolebinding
subjects:
  - kind: ServiceAccount
    name: my_account
    namespace: my_namespace
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: ""

申请许可的时间

# 调整模板并为服务帐户创建权限文件
sed -e "s|my_account|deployer|g" -e "s|my_namespace|default|g" \
    permissions-template.yaml > permissions_deployer.yaml     

# 申请许可
kubectl apply -f permissions_deployer.yaml

现在我们可以简单地在任何实例上使用这个 kube config 配置文件并连接到我们的集群。 您可以使用此命令测试连接

KUBECONFIG=/tmp/kube/kube-conf kubectl get pods

结论

OK,就这样。 是时候使用我们的 Kubernetes 集群即插即用了。

发表评论