podman-kube-generate(1) General Commands Manual podman-kube-generate(1)

podman-kube-generate - تولید فایل YAML کوبرنتیز بر پایه کانتینرها، پادها یا حجم‌ها

podman kube generate [گزینه‌ها] کانتینر... | پاد... | حجم...

دستور podman kube generate مشخصات YAML کوبرنتیز (مشخصات نسخه v1) را بر پایه کانتینرها، پادها یا حجم‌های پادمن تولید می‌کند. بدون در نظر گرفتن اینکه ورودی برای کانتینرها باشد یا پادها، پادمن به‌طور پیش‌فرض مشخصات را در قالب یک پاد (Pod) تولید می‌کند. ورودی می‌تواند به شکل یک یا چند نام یا شناسه از کانتینرها، پادها یا حجم‌ها باشد.

کانتینرها یا پادهای پادمن

حجم‌ها در YAML تولیدشده بر اساس دو نوع مختلف حجم ظاهر می‌شوند. حجم‌های متصل‌شده از نوع بایند (Bind-mounted volumes) به نوع حجم hostPath تبدیل می‌شوند و حجم‌های نام‌دار (named volumes) به نوع حجم persistentVolumeClaim تبدیل می‌گردند. نوع حجم‌های hostPath تولیدشده بسته به وضعیت مسیر روی میزبان یکی از سه زیرنوع خواهند بود: DirectoryOrCreate هنگامی که هیچ فایل یا دایرکتوری روی میزبان وجود ندارد، Directory هنگامی که مسیر میزبان یک دایرکتوری است، یا File هنگامی که مسیر میزبان یک فایل است. مقدار claimName برای یک persistentVolumeClaim همان نام حجم نام‌دار ثبت‌شده در پادمن است.

با استفاده از یک طرح نام‌گذاری استاندارد برای هر نوع حجم، از تداخل بالقوه نام‌ها میان حجم‌ها جلوگیری می‌شود. نوع حجم‌های hostPath بر اساس مسیر روی دستگاه میزبان نام‌گذاری می‌شوند، که در آن اسلش‌ها، بدون در نظر گرفتن اسلش‌های ابتدا و انتها، با خط تیره (hyphen) جایگزین می‌شوند. حالت خاص ریشه فایل‌سیستم، /، به نام root ترجمه می‌شود. علاوه بر این، برای جلوگیری از تداخل نام با حجم‌های persistentVolumeClaim، پسوند -host به نام افزوده می‌شود. هر نوع حجم persistentVolumeClaim از نام حجم نام‌دار مرتبط با خود همراه با پسوند -pvc استفاده می‌کند.

توجه داشته باشید که اگر یک کانتینر راه‌انداز (init container) با نوع once ایجاد شده و پاد شروع به کار کرده باشد، در YAML کوبرنتیز تولیدشده نشان داده نمی‌شود؛ چرا که کانتینرهای راه‌انداز از نوع once پس از اجرا حذف می‌شوند. اگر پاد تنها ایجاد شده و هنوز راه‌اندازی نشده باشد، در YAML تولیدشده حضور خواهد داشت. کانتینرهای راه‌انداز ایجادشده با نوع always همواره در YAML کوبرنتیز تولید می‌شوند، زیرا حتی پس از اتمام موفقیت‌آمیز اجرا نیز هرگز حذف نمی‌گردند.

نکته: هنگام استفاده از حجم‌ها و تولید یک YAML کوبرنتیز برای کانتینر بدون‌ریشه (rootless) و بدون‌امتیاز پادمن روی سیستمی با SELinux فعال، یکی از اقدامات زیر باید انجام شود:
* افزودن گزینه "privileged: true" به مشخصات پاد (pod spec)
* افزودن type: spc_t در زیر securityContext seLinuxOptions در مشخصات پاد
* برچسب‌گذاری مجدد حجم از طریق دستور خط فرمان chcon -t container_file_t -R <directory>

پس از انجام این کار، هنگام ایجاد پاد/کانتینر در کلاستر کوبرنتیز، دسترسی‌های صحیح برای استفاده از حجم برقرار خواهد بود.

توجه داشته باشید که فایل YAML کوبرنتیز تولیدشده می‌تواند برای اجرای مجدد استقرار از طریق podman-play-kube(1) استفاده شود.

توجه داشته باشید که اگر پاد در حال تولید با فلگ --infra-name ایجاد شده باشد، در YAML کوبرنتیز تولیدشده برچسب حاشیه‌ای io.podman.annotations.infra.name تنظیم خواهد شد که مقدار آن همان نام کانتینر زیرساختی تعیین‌شده توسط کاربر است.

توجه داشته باشید که هر دو نوع Deployment و DaemonSet فقط می‌توانند دارای restartPolicy با مقدار Always باشند.

توجه داشته باشید که Job فقط می‌تواند دارای restartPolicy با مقدار OnFailure یا Never باشد. به‌طور پیش‌فرض، پادمن هنگام تولید YAML کوبرنتیز با دستور kube generate آن را روی Never تنظیم می‌کند.

خروجی را به‌جای خروجی استاندارد (STDOUT) در فایل ارائه‌شده می‌نویسد. اگر فایل از قبل موجود باشد، kube generate از جایگزینی آن خودداری کرده و یک خطا برمی‌گرداند.

افزودن حاشیه‌نویسی‌های رزروشدهٔ مخصوص پادمن در فایل YAML تولیدشده (توسط کوبرنتیز قابل‌استفاده نیست).

مقداری که هنگام تولید نوع Deployment برای replicas (شمار رونوشت‌ها) تنظیم می‌شود. نکته: این مورد فقط همراه با گزینهٔ --type=deployment قابل تنظیم است.

تولید یک شیء سرویس کوبرنتیز علاوه بر پادها. برای تولید مشخصات Service برای خروجی Pod متناظر استفاده می‌شود. به‌ویژه اگر شیء دارای نگاشت پورت (portmap bindings) باشد، مشخصات سرویس شامل یک اعلان NodePort برای در دسترس قرار دادن سرویس خواهد بود. پورت تصادفی توسط پادمن در مشخصات اختصاص داده می‌شود.

نوع (kind) کوبرنتیز جهت تولید در فایل YAML. در حال حاضر تنها مشخصات پشتیبانی‌شدهٔ کوبرنتیز شامل Pod، Deployment، Job و DaemonSet هستند. به‌طور پیش‌فرض، مشخصات Pod تولید می‌شود.

تولید YAML پاد کوبرنتیز برای کانتینر مشخص‌شده:

$ podman kube generate some-mariadb
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.8.2
# NOTE: If you generated this yaml from an unprivileged and rootless podman container on an SELinux
# enabled system, check the podman generate kube man page for steps to follow to ensure that your pod/container
# has the right permissions to access the volumes added.
---
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2024-01-09T02:24:55Z"
  labels:
    app: some-mariadb-pod
  name: some-mariadb-pod
spec:
  containers:
  - args:
    - mariadbd
    env:
    - name: MARIADB_ROOT_PASSWORD
      value: x
    image: docker.io/library/mariadb:10.11
    name: some-mariadb
    ports:
    - containerPort: 3306
      hostPort: 34891
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: mariadb_data-pvc
  volumes:
  - name: mariadb_data-pvc
    persistentVolumeClaim:
      claimName: mariadb_data

تولید YAML نوع Deployment کوبرنتیز با ۳ رونوشت برای کانتینر مشخص‌شده:

$ podman kube generate --type deployment --replicas 3 dep-ctr
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-4.5.0-dev
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: "2023-03-27T20:45:08Z"
  labels:
    app: dep-ctr-pod
  name: dep-ctr-pod-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dep-ctr-pod
  template:
    metadata:
      annotations:
        io.podman.annotations.ulimit: nofile=524288:524288,nproc=127332:127332
      creationTimestamp: "2023-03-27T20:45:08Z"
      labels:
        app: dep-ctr-pod
      name: dep-ctr-pod
    spec:
      containers:
      - command:
        - top
        image: docker.io/library/alpine:latest
        name: dep-ctr

تولید YAML پاد کوبرنتیز برای کانتینر مشخص‌شده با دایرکتوری میزبان /home/user/my-data که به‌صورت بایند روی مسیر /volume کانتینر متصل شده است:

$ podman kube generate my-container-with-bind-mounted-data
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.1.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-03-18T16:26:08Z"
  labels:
    app: my-container-with-bind-mounted-data
  name: my-container-with-bind-mounted-data
spec:
  containers:
  - command:
    - /bin/sh
    image: docker.io/library/alpine:latest
    name: test-bind-mount
    volumeMounts:
    - mountPath: /volume
      name: home-user-my-data-host
  restartPolicy: Never
  volumes:
  - hostPath:
      path: /home/user/my-data
      type: Directory
    name: home-user-my-data-host

تولید YAML پاد کوبرنتیز برای کانتینر مشخص‌شده با حجم نام‌دار priceless-data که روی مسیر /volume کانتینر متصل شده است:

$ podman kube generate my-container-using-priceless-data
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.1.0-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2021-03-18T16:26:08Z"
  labels:
    app: my-container-using-priceless-data
  name: my-container-using-priceless-data
spec:
  containers:
  - command:
    - /bin/sh
    image: docker.io/library/alpine:latest
    name: test-bind-mount
    volumeMounts:
    - mountPath: /volume
      name: priceless-data-pvc
  restartPolicy: Never
  volumes:
  - name: priceless-data-pvc
    persistentVolumeClaim:
      claimName: priceless-data

تولید YAML پاد کوبرنتیز برای پاد مشخص‌شده و گنجاندن یک سرویس:

$ sudo podman kube generate -s demoweb
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-0.12.2-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2018-12-18T15:16:06Z
  labels:
    app: demoweb
  name: demoweb-libpod
spec:
  containers:
  - command:
    - python3
    - /root/code/graph.py
    image: quay.io/baude/demoweb:latest
    name: practicalarchimedes
    tty: true
    workingDir: /root/code
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-12-18T15:16:06Z
  labels:
    app: demoweb
  name: demoweb-libpod
spec:
  ports:
  - name: "8050"
    nodePort: 31269
    port: 8050
    targetPort: 0
  selector:
    app: demoweb
  type: NodePort
status:
  loadBalancer: {}

podman(1), podman-container(1), podman-pod(1), podman-kube-play(1), podman-kube-down(1)

دسامبر ۲۰۱۸، در ابتدا توسط Brent Baude (bbaude at redhat dot com) گردآوری شد