У меня была похожая ситуация. Вот как я решил это (я использую пространство имен, отличное от значения по умолчанию).
Доступ к API осуществляется путем создания ServiceAccount, назначения его Pod и привязки к нему роли.
1. Создайте ServiceAccount.
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-serviceaccount
namespace: my-namespace
2. Создайте роль: в этом разделе вам нужно предоставить список ресурсов и список действий, к которым вы хотите получить доступ. Вот пример, в котором вы хотите перечислить конечные точки, а также получить подробную информацию о конкретной конечной точке.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: my-role
namespace: my-namespace
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list"]
3. Привяжите роль к сервисному аккаунту
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-role-binding
namespace: my-namespace
subjects:
- kind: ServiceAccount
name: my-serviceaccount
roleRef:
kind: Role
name: my-role
apiGroup: rbac.authorization.k8s.io
4. Назначьте учетную запись службы модулям в вашем развертывании (она должна быть в template.spec).
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
namespace: my-namespace
spec:
replicas: 1
selector:
matchLabels:
app: my-pod
template:
metadata:
labels:
app: my-pod
spec:
serviceAccountName: my-serviceaccount
containers:
- name: my-pod
...
После установки всех аспектов безопасности у вас будет достаточно прав для доступа к API в вашем Pod. Вся необходимая информация для связи с сервером API монтируется в /var/run/secrets/kubernetes.io/serviceaccount
вашего модуля. Вы можете использовать следующий сценарий оболочки (возможно, добавьте его в свою КОМАНДУ или ENTRYPOINT образа Docker).
#!/bin/bash
# Point to the internal API server hostname
API_SERVER=https://kubernetes.default.svc
# Path to ServiceAccount token
SERVICE_ACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICE_ACCOUNT}/namespace)
# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICE_ACCOUNT}/token)
# Reference the internal certificate authority (CA)
CA_CERT=${SERVICE_ACCOUNT}/ca.crt
С этого момента это просто вызов REST API. Вы можете прочитать эти переменные среды на любом языке по вашему выбору и получить доступ к API.
Вот пример перечисления конечной точки для вашего варианта использования
# List all the endpoints in the namespace that Pod is running
curl --cacert ${CA_CERT} --header "Authorization: Bearer ${TOKEN}" -X GET \
"${API_SERVER}/api/v1/namespaces/${NAMESPACE}/endpoints"
# List all the endpoints in the namespace that Pod is running for a deployment
curl --cacert ${CA_CERT} --header "Authorization: Bearer ${TOKEN}" -X GET \
"${API_SERVER}/api/v1/namespaces/${NAMESPACE}/endpoints/my-deployment"
Для получения дополнительной информации о доступных конечных точках API и способах их вызова см. Справочник по API.
person
Iraj Hedayati
schedule
11.12.2020