Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Last revisionBoth sides next revision | ||
devops:hashicorp_vault_workflow [2020/08/13 10:21] – [Автоматическое обновление сертификатов с помощью consul-template] admin | devops:hashicorp_vault_workflow [2020/08/13 19:46] – [Автоматическое обновление сертификатов с помощью consul-template] admin | ||
---|---|---|---|
Line 306: | Line 306: | ||
а также - создадим роль в **vault**, которую привяжем к ServiceAccount (с правами которого будет работать pod) и назначим этой роли созданную ранее политику, | а также - создадим роль в **vault**, которую привяжем к ServiceAccount (с правами которого будет работать pod) и назначим этой роли созданную ранее политику, | ||
kubectl -n vault exec -it vault-0 -- vault write auth/ | kubectl -n vault exec -it vault-0 -- vault write auth/ | ||
- | + | А теперь создадим объекты в K8S. | |
- | https://www.tecmint.com/find-process-name-pid-number-linux/ \\ | + | ===== configmap ===== |
- | https:// | + | Конфигмап содержит три конфига: |
+ | * для **init**-контейнера **vault-agent**, | ||
+ | * для **consul-template**в котором описано где взять токен, поученный **vault-agent**, | ||
+ | * конфиг **nginx**, в котором настроен HTTPS-сервер, | ||
+ | < | ||
+ | kind: ConfigMap | ||
+ | metadata: | ||
+ | name: nginx-cert-renew-config | ||
+ | namespace: vault | ||
+ | data: | ||
+ | vault-agent-config.hcl: | ||
+ | # Comment this out if running as sidecar instead of initContainer | ||
+ | exit_after_auth = true | ||
+ | |||
+ | pid_file = "/ | ||
+ | |||
+ | auto_auth { | ||
+ | method " | ||
+ | mount_path = " | ||
+ | config = { | ||
+ | role = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | sink " | ||
+ | config = { | ||
+ | path = "/ | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | consul-template-config.hcl: | ||
+ | vault { | ||
+ | renew_token = false | ||
+ | vault_agent_token_file = "/ | ||
+ | retry { | ||
+ | backoff = " | ||
+ | } | ||
+ | } | ||
+ | |||
+ | template { | ||
+ | contents = "{{ with secret \" | ||
+ | destination="/ | ||
+ | command=" | ||
+ | } | ||
+ | template { | ||
+ | contents = "{{ with secret \" | ||
+ | destination="/ | ||
+ | } | ||
+ | template { | ||
+ | contents = "{{ with secret \" | ||
+ | destination="/ | ||
+ | } | ||
+ | |||
+ | nginx_ssl.conf: | ||
+ | server { | ||
+ | listen | ||
+ | server_name | ||
+ | ssl_certificate | ||
+ | ssl_certificate_key / | ||
+ | ssl_protocols | ||
+ | ssl_ciphers | ||
+ | |||
+ | location / { | ||
+ | root | ||
+ | index index.html index.htm; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | ===== Pod ===== | ||
+ | Манифест Pod'а с тремя контейнерами: | ||
+ | < | ||
+ | kind: Pod | ||
+ | metadata: | ||
+ | name: nginx-cert-renew-example | ||
+ | namespace: vault | ||
+ | labels: | ||
+ | app: nginx | ||
+ | spec: | ||
+ | shareProcessNamespace: | ||
+ | serviceAccountName: | ||
+ | volumes: | ||
+ | - configMap: | ||
+ | items: | ||
+ | - key: vault-agent-config.hcl | ||
+ | path: vault-agent-config.hcl | ||
+ | - key: consul-template-config.hcl | ||
+ | path: consul-template-config.hcl | ||
+ | name: nginx-cert-renew-config | ||
+ | name: config | ||
+ | - configMap: | ||
+ | items: | ||
+ | - key: nginx_ssl.conf | ||
+ | path: nginx_ssl.conf | ||
+ | name: nginx-cert-renew-config | ||
+ | name: nginx-config | ||
+ | - emptyDir: {} | ||
+ | name: shared-data | ||
+ | - emptyDir: {} | ||
+ | name: vault-token | ||
+ | |||
+ | initContainers: | ||
+ | - args: | ||
+ | - agent | ||
+ | - -config=/etc/vault/ | ||
+ | - -log-level=debug | ||
+ | env: | ||
+ | - name: VAULT_ADDR | ||
+ | value: http:// | ||
+ | image: vault | ||
+ | imagePullPolicy: | ||
+ | name: vault-agent | ||
+ | volumeMounts: | ||
+ | - mountPath: / | ||
+ | name: config | ||
+ | - name: vault-token | ||
+ | mountPath: / | ||
+ | |||
+ | containers: | ||
+ | - image: nginx | ||
+ | imagePullPolicy: | ||
+ | name: nginx-container | ||
+ | ports: | ||
+ | - containerPort: | ||
+ | volumeMounts: | ||
+ | - mountPath: / | ||
+ | name: shared-data | ||
+ | - mountPath: / | ||
+ | name: nginx-config | ||
+ | | ||
+ | image: hashicorp/ | ||
+ | imagePullPolicy: | ||
+ | securityContext: | ||
+ | runAsUser: 0 | ||
+ | capabilities: | ||
+ | add: | ||
+ | | ||
+ | volumeMounts: | ||
+ | - name: vault-token | ||
+ | mountPath: | ||
+ | - name: config | ||
+ | mountPath: / | ||
+ | - name: shared-data | ||
+ | mountPath: / | ||
+ | env: | ||
+ | - name: HOME | ||
+ | value: / | ||
+ | - name: VAULT_ADDR | ||
+ | value: http:// | ||
+ | args: [" | ||
+ | </ | ||
+ | Тут стоит обратить внимание на: | ||
+ | shareProcessNamespace: | ||
+ | Эта конструкция позволяет иметь процессам всех контейнеров общий **namespace**, | ||
+ | Также важно, чтобы у контейнера consul-template был такой **securityContext**: | ||
+ | securityContext: | ||
+ | runAsUser: 0 | ||
+ | capabilities: | ||
+ | add: | ||
+ | - SYS_PTRACE | ||
+ | Это значит, |