Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
devops:kubernetes [2021/04/21 12:50] – [Отмена удаления PersistentVolume] admindevops:kubernetes [2022/03/24 15:20] – [Headless Services для Stafullset] admin
Line 309: Line 309:
 В список: В список:
   kubectl -n elasticsearch patch sts es-data --type=json -p='[{"op": "add", "path": "/spec/template/spec/tolerations", "value":[{"effect":"NoSchedule","key":"node.kubernetes.io/rrr","operator":"Exists"}]}]'   kubectl -n elasticsearch patch sts es-data --type=json -p='[{"op": "add", "path": "/spec/template/spec/tolerations", "value":[{"effect":"NoSchedule","key":"node.kubernetes.io/rrr","operator":"Exists"}]}]'
 +Добавляем порт для контейнера в **Deployment**:
 +  kubectl patch deployment mcs-api --type=json -p='[{"op": "add", "path": "/spec/template/spec/containers/0/ports", "value":[{"containerPort": 5000}]}]'
  
 ===== Патчинг нескольких значений за раз ===== ===== Патчинг нескольких значений за раз =====
Line 350: Line 352:
 set -e set -e
  
-KUB_CONTEXT='kub-apps-test+KUB_CONTEXT='kubernetes-admin@kubernetes
-KUB_USERNAME='developer' +KUB_USERNAME='developer-ro
-KUB_USERGROUP='app-dev-full'+KUB_USERGROUP='mcs-ro'
 #cluster or ns (namespace) #cluster or ns (namespace)
 #AUTH_SCOPE='cluster' #AUTH_SCOPE='cluster'
 AUTH_SCOPE='ns' AUTH_SCOPE='ns'
 # If AUTH_SCOPE = ns then we need namespace name # If AUTH_SCOPE = ns then we need namespace name
-KUB_NAMESPACE='app-dev+KUB_NAMESPACE='default
-KUB_ROLE_NAME='app-dev-full'+KUB_ROLE_NAME="${KUB_USERGROUP}-role"
 # Comma separated quoted - '"get", "list"'. For all use "*" # Comma separated quoted - '"get", "list"'. For all use "*"
 KUB_ROLE_APIGROUPS='"*"' KUB_ROLE_APIGROUPS='"*"'
 KUB_ROLE_RESOURCES='"*"' KUB_ROLE_RESOURCES='"*"'
-KUB_ROLE_VERBS='"*"'+KUB_ROLE_VERBS='"get", "list"'
  
 echo "Switching to context '${KUB_CONTEXT}'..." echo "Switching to context '${KUB_CONTEXT}'..."
Line 447: Line 449:
   name: ${KUB_USERGROUP}   name: ${KUB_USERGROUP}
   apiGroup: rbac.authorization.k8s.io   apiGroup: rbac.authorization.k8s.io
-roleRef:                              +roleRef: 
- kind: ClusterRole                          + kind: ClusterRole
  name: ${KUB_ROLE_NAME}  name: ${KUB_ROLE_NAME}
- apiGroup: rbac.authorization.k8s.io + apiGroup: rbac.authorization.k8s.io
 EOF EOF
 fi fi
Line 477: Line 479:
   name: ${KUB_USERGROUP}   name: ${KUB_USERGROUP}
   apiGroup: rbac.authorization.k8s.io   apiGroup: rbac.authorization.k8s.io
-roleRef:                              +roleRef: 
- kind: Role                          + kind: Role
  name: ${KUB_ROLE_NAME}  name: ${KUB_ROLE_NAME}
- apiGroup: rbac.authorization.k8s.io + apiGroup: rbac.authorization.k8s.io
 EOF EOF
 fi fi
Line 508: Line 510:
 current-context: ${KUB_USERNAME}-${CLUSTER_NAME} current-context: ${KUB_USERNAME}-${CLUSTER_NAME}
 EOF EOF
 +
 +kubectl delete certificatesigningrequests ${KUB_USERNAME}_csr
 </code> </code>
 ===== Создание закрытого ключа пользователя и запроса сертификата ===== ===== Создание закрытого ключа пользователя и запроса сертификата =====
Line 905: Line 909:
   for pv in $PVs; do ./resetpv --etcd-ca ./ca.crt --etcd-cert ./server.crt --etcd-key ./server.key --etcd-host 10.77.68.1 --etcd-port 2379 $pv; done   for pv in $PVs; do ./resetpv --etcd-ca ./ca.crt --etcd-cert ./server.crt --etcd-key ./server.key --etcd-host 10.77.68.1 --etcd-port 2379 $pv; done
  
 +====== Распределить поды деплоймента по разным нодам кластера ======
 +<code>
 +apiVersion: apps/v1
 +kind: Deployment
 +metadata:
 +  name: my-service
 +  labels:
 +    app: my-service
 +spec:
 +  replicas: 2
 +  selector:
 +    matchLabels:
 +      app: my-service
 +  template:
 +    metadata:
 +      labels:
 +        app: my-service
 +    spec:
 +      topologySpreadConstraints:
 +      - maxSkew: 1
 +        topologyKey: kubernetes.io/hostname
 +        whenUnsatisfiable: DoNotSchedule
 +        labelSelector:
 +          matchLabels:
 +            app: my-service
 +</code>
 +
 +====== Headless Services для Stafullset ======
 +И другие вопросы про то как давать доступ к индивидуальным подам реплик стейтфуллсетов. \\
 +https://www.tigera.io/blog/exposing-statefulsets-in-kubernetes/
 +
 +Following the normal practice of having a single Service point to all instances of your application doesn’t work when you want to query a specific instance directly. This is already handled internally with the Headless Service you create alongside the StatefulSet. The created ervice will not be given a clusterIP, but will instead simply include a list of Endpoints. These Endpoints are then used to generate instance-specific DNS records in the form of: <StatefulSet>-<Index>.<Service>.<Namespace>.svc.cluster.locale.g., app-0.myapp.default.svc.cluster.local.
 +
 +Обычно сервисы используются в k8s для доступа ко всем рпликам сервиса, однако, в слуаче со statefull-приложениями может понадобиться доступ к конкретной реплике. Для этого в k8s существуют Statefullset'ы и связанные с ними Headless-сервисы. \\
 +Что такое **Statefullset** - это способ создать набор именованных реплик сервиса, каждая из которых будет сохранять свое имя и после перезапуска. \\
 +Что такое **Headless Service** - это сервис, который НЕ имеет адреса в кластере (**ClusterIP: None**) и НЕ выполняет балансировку подключний по эндпоинтам, а просто является списком эндпоинтов для именованных реплик, управляемых Statefullset'ом. А для доступа к именованным репликам в DNS кластера генерируются имена:
 +  <StatefulSet>-<Ordinal>.<Service>.<Namespace>.svc.cluster.local
 +например:
 +  app-0.myapp.default.svc.cluster.local.
 +Вопрос - а как же можно опубликовать именованную реплику в составе Statefullset'а, например через Ingress?? Ведь для этого надо как-то сослаться на сервис, который будет связан с портом на конкретной реплике! \\
 +Все просто - каждый под, управляеый Statefullset'ом имеет уникальну метку (примерно такую - **statefulset.kubernetes.io/pod-name: app-0** ), которую можно использовать в качестве селектора в сервисе:
 +<code>apiVersion: v1
 +kind: Service
 +metadata:
 +  name: app-0
 +spec:
 +  type: LoadBalancer
 +  selector:
 +    statefulset.kubernetes.io/pod-name: app-0
 +  ports:
 +  - protocol: TCP
 +    port: 80
 +    targetPort: 80</code> 
 +
 +====== Как скопировать секрет из одного неймспейса в другой ======
 +  kubectl get secret my-tlssecret --namespace=nginx-ns -o yaml | sed 's/namespace: .*/namespace: default/' | kubectl apply -f -
  • devops/kubernetes.txt
  • Last modified: 2023/11/30 08:03
  • by admin