老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Podman的使用方法是怎樣的

Podman的使用方法是怎樣的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創新互聯建站長期為上千家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為赤壁企業提供專業的網站制作、成都做網站,赤壁網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發。

Podman 原來是 CRI-O 項目的一部分,后來被分離成一個單獨的項目叫 libpod。Podman 的使用體驗和 Docker 類似,不同的是 Podman 沒有 daemon。以前使用 Docker CLI 的時候,Docker CLI 會通過 gRPC API 去跟 Docker Engine 說「我要啟動一個容器」,然后 Docker Engine 才會通過 OCI Container runtime(默認是 runc)來啟動一個容器。這就意味著容器的進程不可能是 Docker CLI 的子進程,而是 Docker Engine 的子進程。

Podman 比較簡單粗暴,它不使用 Daemon,而是直接通過 OCI runtime(默認也是 runc)來啟動容器,所以容器的進程是 podman 的子進程。這比較像 Linux 的 fork/exec 模型,而 Docker 采用的是 C/S(客戶端/服務器)模型。與 C/S 模型相比,fork/exec 模型有很多優勢,比如:

  • 系統管理員可以知道某個容器進程到底是誰啟動的。

  • 如果利用 cgroup 對 podman 做一些限制,那么所有創建的容器都會被限制。

  • SD_NOTIFY: 如果將 podman 命令放入 systemd 單元文件中,容器進程可以通過 podman 返回通知,表明服務已準備好接收任務。

  • socket 激活: 可以將連接的 socket 從 systemd 傳遞到 podman,并傳遞到容器進程以便使用它們。

廢話不多說,下面我們直接進入實戰環節,本文將手把手教你如何用 podman 來部署靜態博客,并通過 Sidecar 模式將博客所在的容器加入到 Envoy mesh 之中。

1. 方案架構

我的部署方案涉及到兩層 Envoy:

  • 首先會有一個前端代理單獨跑一個容器。前端代理的工作是給訪問者提供一個入口,將來自外部的訪問請求轉發到具體的后端服務。

  • 其次,博客靜態頁面由 nginx 提供,同時以 Sidecar 模式運行一個 Envoy 容器,它與 nginx 共享 network nemspace。

  • 所有的 Envoy 形成一個 mesh,然后在他們之間共享路由信息。

我之前寫過一篇用 Docker 部署 hugo 靜態博客并配置 HTTPS 證書的文章,本文采用的是相同的方案,只是將 docker 換成了 podman,具體參考為 Envoy 開啟 TLS 驗證實戰。

2. 部署 hugo 和 sidecar proxy

我的博客是通過 hugo 生成的靜態頁面,可以將其放到 nginx 中,其他靜態網站工具類似(比如 hexo 等),都可以這么做?,F在我要做的是讓 nginx 容器和 envoy 容器共享同一個 network namespace,同時還要讓前端代理能夠通過域名來進行服務發現。以前用 docker 很簡單,直接用 docker-compose 就搞定了,podman 就比較麻煩了,它又不能用 docker-compose,服務發現看來是搞不定了。

好不容易在 Github 上發現了一個項目叫 podman-compose,以為有救了,試用了一下發現還是不行,podman-compose 創建容器時會將字段 network_mode: "service:hugo" 轉化為 podman CLI 的參數 --network service:hugo(真腦殘),導致容器創建失敗,報錯信息為 CNI network "service:hugo" not found。將該字段值改為 network_mode: "container:hugo_hugo_1" 可以啟動成功,然而又引來了另一個問題:podman-compose 的做法是為每一個 service 創建一個 pod(pod 的名字為 docker-compose.yml 所在目錄名稱),然后往這個 pod 中添加容器。我總不能將前端代理和后端服務塞進同一個 pod 中吧?只能分別為前端代理和 hugo 創建兩個目錄,然后分別創建 docker-compose.yml。這個問題解決了,下個問題又來了,podman-compose 不支持通過 service name 進行服務發現,扒了一圈發現支持 links(其實就是加個參數 --add-host),然而 links 只在同一個 pod 下才生效,我都拆分成兩個 pod 了,links 鞭長莫及啊,還是沒什么卵用。我能怎么辦,現在唯一的辦法就是手擼命令行了。

上面我提到了一個新名詞叫 pod,這里花 30 秒的時間給大家簡單介紹一下,如果你是 Kubernetes 的重度使用者,對這個詞應該不陌生,但這里確實說的是 podman 的 pod,意思還是一樣的,先創建一個 pause 容器,然后再創建業務容器,業務容器共享 pause 容器的各種 linux namespace,因此同一個 pod 中的容器之間可以通過 localhost 輕松地相互通信。不僅如此,podman 還可以將 pod 導出為 Kubernetes 的聲明式資源定義,舉個栗子:

先創建一個 pod:

$ podman pod create --name hugo

查看 pod:

$ podman pod ls

POD ID         NAME   STATUS    CREATED         # OF CONTAINERS   INFRA ID
88226423c4d2   hugo   Running   2 minutes ago   2                 7e030ef2e7ca

在這個 pod 中啟動一個 hugo 容器:

$ podman run -d --pod hugo nginx:alpine

查看容器:

$ podman ps

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  3 minutes ago  Up 3 minutes ago         reverent_kirch

查看所有容器,包括 pause 容器:

$ podman ps -a

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  4 minutes ago  Up 4 minutes ago         reverent_kirch
7e030ef2e7ca  k8s.gcr.io/pause:3.1                                  6 minutes ago  Up 6 minutes ago         88226423c4d2-infra

查看所有容器,包括 pause 容器,并顯示容器所屬的 pod id:

$ podman ps -ap

CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS  NAMES               POD
3c91cab1e99d  docker.io/library/nginx:alpine  nginx -g daemon o...  4 minutes ago  Up 4 minutes ago         reverent_kirch      88226423c4d2
7e030ef2e7ca  k8s.gcr.io/pause:3.1                                  6 minutes ago  Up 6 minutes ago         88226423c4d2-infra  88226423c4d2

查看 pod 中進程的資源使用情況:

$ podman pod top hugo

USER    PID   PPID   %CPU    ELAPSED           TTY   TIME   COMMAND
root    1     0      0.000   8m5.045493912s    ?     0s     nginx: master process nginx -g daemon off;
nginx   6     1      0.000   8m5.045600833s    ?     0s     nginx: worker process
nginx   7     1      0.000   8m5.045638877s    ?     0s     nginx: worker process
0       1     0      0.000   9m41.051039367s   ?     0s     /pause

將 pod 導出為聲明式部署清單:

$ podman generate kube hugo > hugo.yaml

查看部署清單內容:

$ cat hugo.yaml

# Generation of Kubernetes YAML is still under development!
#
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-1.0.2-dev
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: 2019-10-17T04:17:40Z
  labels:
    app: hugo
  name: hugo
spec:
  containers:
  - command:
    - nginx
    - -g
    - daemon off;
    env:
    - name: PATH
      value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    - name: TERM
      value: xterm
    - name: HOSTNAME
    - name: container
      value: podman
    - name: NGINX_VERSION
      value: 1.17.4
    - name: NJS_VERSION
      value: 0.3.5
    - name: PKG_RELEASE
      value: "1"
    image: docker.io/library/nginx:alpine
    name: reverentkirch
    resources: {}
    securityContext:
      allowPrivilegeEscalation: true
      capabilities: {}
      privileged: false
      readOnlyRootFilesystem: false
    workingDir: /
status: {}

怎么樣,是不是有種熟悉的味道?這是一個兼容 kubernetes 的 pod 定義,你可以直接通過 kubectl apply -f hugo.yaml 將其部署在 Kubernetes 集群中,也可以直接通過 podman 部署,步驟大致是這樣的:

先刪除之前創建的 pod:

$ podman pod rm -f hugo

然后通過部署清單創建 pod:

$ podman play kube hugo.yaml

回到之前的問題,如果通過聲明式定義來創建 pod,還是無法解決服務發現的問題,除非換個支持靜態 IP 的 CNI 插件,而支持靜態 IP 的這些 CNI 插件又需要 etcd 作為數據庫,我就這么點資源,可不想再加個 etcd,還是手擼命令行吧。

首先我要創建一個 hugo 容器,并指定容器的 IP:

$ podman run -d --name hugo \
  --ip=10.88.0.10 \
  -v /opt/hugo/public:/usr/share/nginx/html \
  -v /etc/localtime:/etc/localtime \
  nginx:alpine

再創建一個 envoy 容器,與 hugo 容器共享 network namespace:

$ podman run -d --name hugo-envoy \
  -v /opt/hugo/service-envoy.yaml:/etc/envoy/envoy.yaml \
  -v /etc/localtime:/etc/localtime \
  --net=container:hugo envoyproxy/envoy-alpine:latest

service-envoy.yaml 的內容如下:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:
            name: local_route
            virtual_hosts:
            - name: service
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: local_service
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: local_service
    connect_timeout: 0.25s
    type: strict_DNS
    lb_policy: round_robin
    hosts:
    - socket_address:
        address: 127.0.0.1
        port_value: 80
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8081

具體的含義請參考為 Envoy 開啟 TLS 驗證實戰。

本文開頭提到 podman 創建的容器是 podman 的子進程,這個表述可能比較模糊,實際上 podman 由兩部分組成,一個是 podman CLI,還有一個是 container runtime,container runtime 由 conmon 來負責,主要包括監控、日志、TTY 分配以及類似 out-of-memory 情況的雜事。也就是說,conmon 是所有容器的父進程。

Podman的使用方法是怎樣的

conmon 需要去做所有 systemd 不做或者不想做的事情。即使 CRI-O 不直接使用 systemd 來管理容器,它也將容器分配到 sytemd 兼容的 cgroup 中,這樣常規的 systemd 工具比如 systemctl 就可以看見容器資源使用情況了。

$ podman ps

CONTAINER ID  IMAGE                                     COMMAND               CREATED             STATUS                 PORTS  NAMES
42762bf7d37a  docker.io/envoyproxy/envoy-alpine:latest  /docker-entrypoin...  About a minute ago  Up About a minute ago         hugo-envoy
f0204fdc9524  docker.io/library/nginx:alpine            nginx -g daemon o...  2 minutes ago       Up 2 minutes ago              hugo

Podman的使用方法是怎樣的

對 cgroup 不熟的同學,可以參考下面這個系列:

  • 深入理解 Linux Cgroup 系列(一):基本概念

  • 深入理解 Linux Cgroup 系列(二):玩轉 CPU

  • 深入理解 Linux Cgroup 系列(三):內存

  • 深入理解 Kubernetes 資源限制:CPU

  • Kubernetes 內存資源限制實戰

  • Kubernetes Pod 驅逐詳解

零基礎的同學建議按照上面的目錄從上到下打怪升級,祝你好運!

3. 部署前端代理

這個很簡單,直接創建容器就好了:

$ podman run -d --name front-envoy \
--add-host=hugo:10.88.0.10 \
-v /opt/hugo/front-envoy.yaml:/etc/envoy/envoy.yaml \
-v /etc/localtime:/etc/localtime \
-v /root/.acme.sh/yangcs.net:/root/.acme.sh/yangcs.net \
--net host envoyproxy/envoy

由于沒辦法自動服務發現,需要通過參數 --add-host 手動添加 hosts 到容器中。envoy 的配置文件中是通過域名來添加 cluster 的,front-envoy.yaml 內容如下:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 80
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                redirect:
                  https_redirect: true
                  response_code: "FOUND"
          http_filters:
          - name: envoy.router
            config: {}
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 443
    filter_chains:
    - filter_chain_match:
        server_names: ["yangcs.net", "www.yangcs.net"]
      tls_context:
        common_tls_context:
          alpn_protocols: h3
          tls_params:
            tls_maximum_protocol_version: TLSv1_3
          tls_certificates:
            - certificate_chain:
                filename: "/root/.acme.sh/yangcs.net/fullchain.cer"
              private_key:
                filename: "/root/.acme.sh/yangcs.net/yangcs.net.key"
      filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "yangcs.net"
              - "www.yangcs.net"
              routes:
              - match:
                  prefix: "/admin"
                route:
                  prefix_rewrite: "/"
                  cluster: envoy-ui
              - match:
                  prefix: "/"
                route:
                  cluster: hugo
                  response_headers_to_add:
                    - header:
                        key: "Strict-Transport-Security"
                        value: "max-age=63072000; includeSubDomains; preload"
          http_filters:
          - name: envoy.router
            config: {}
  clusters:
  - name: hugo
    connect_timeout: 0.25s
    type: strict_dns
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address: hugo
        port_value: 8080
admin:
  access_log_path: "/dev/null"
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

具體的含義請參考為 Envoy 開啟 TLS 驗證實戰。

現在就可以通過公網域名訪問博客網站了,如果后續還有其他應用,都可以參考第二節的步驟,然后重新創建前端代理,添加 --add-host 參數。以我的網站 https://www.yangcs.net 為例:

Podman的使用方法是怎樣的

Podman的使用方法是怎樣的

Podman的使用方法是怎樣的

我好像透露了一些什么不得了的東西,就此打住,你也不要說,你也不要問。

4. 開機自啟

由于 podman 不再使用 daemon 管理服務,--restart 參數被廢棄了,要想實現開機自動啟動容器,只能通過 systemd 來管理了。先創建 systemd 服務配置文件:

$ vim /etc/systemd/system/hugo_container.service

[Unit]
Description=Podman Hugo Service
After=network.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a hugo
ExecStop=/usr/bin/podman stop -t 10 hugo
Restart=always

[Install]
WantedBy=multi-user.target
$ vim /etc/systemd/system/hugo-envoy_container.service

[Unit]
Description=Podman Hugo Sidecar Service
After=network.target
After=network-online.target
After=hugo_container.service

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a hugo-envoy
ExecStop=/usr/bin/podman stop -t 10 hugo-envoy
Restart=always

[Install]
WantedBy=multi-user.target
$ vim /etc/systemd/system/front-envoy_container.service

[Unit]
Description=Podman Front Envoy Service
After=network.target
After=network-online.target
After=hugo_container.service hugo-envoy_container.service

[Service]
Type=simple
ExecStart=/usr/bin/podman start -a front-envoy
ExecStop=/usr/bin/podman stop -t 10 front-envoy
Restart=always

[Install]
WantedBy=multi-user.target

然后將之前停止之前創建的容器,注意:是停止,不是刪除!

$ podman stop $(podman ps -aq)

最后通過 systemd 服務啟動這些容器。

$ systemctl start hugo_container
$ systemctl start hugo-envoy_container
$ systemctl start front-envoy_container

設置開機自啟。

$ systemctl enable hugo_container
$ systemctl enable hugo-envoy_container
$ systemctl enable front-envoy_container

之后每次系統重啟后 systemd 都會自動啟動這個服務所對應的容器。

4. 總結

以上就是將博客從 Docker 遷移到 Podman 的所有變更操作,總體看下來還是比較曲折,因為 Podman 是為 Kubernetes 而設計的,而我要求太高了,就一個資源緊張的 vps,即不想上 Kubernetes,也不想上 etcd,既想搞 sidecar,又想搞自動服務發現,我能怎么辦,我也很絕望啊,這個事怨不得 podman,為了防止在大家心里留下 “podman 不好用”的印象,特此聲明一下。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創新互聯行業資訊頻道,感謝您對創新互聯的支持。


本文標題:Podman的使用方法是怎樣的
轉載來于:http://www.xueling.net.cn/article/ppsshc.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 国产在线一区二区三区激情欧美 | 中文字幕在线免费看 | 成人一区二区三区在线观看 | 少妇被躁爽到高潮无码 | 99久久久国产精品免费四虎 | 黄色视频网站在线观看免费 | 大地资源中文在线观看免费 | 伊人wwwyiren22cn| 国产综合久久 | 国产精品高潮呻吟久久a | momsxxxxfreemilf图片 | 欧美日韩在线精品一区二区三区激情综合 | 免费观看又黄又爽的视频 | 国产一区二区三区不卡视频网站 | 222aaa精品影院 | 婷婷性多多影院 | 欧美日韩国产高清一区二区三区 | 羞羞视频日本动漫免费网站 | 欧洲日韩av| 亚洲欧洲专线一区 | 日韩一区二区三区色 | 亚洲国产精品久久久久秋霞 | 国产91av在线 | 久久99精品久久久久久秒播蜜臀 | 黑人操亚洲女人 | 日韩在线观看成人 | 少妇扒开毛茸茸的b自慰 | 亚洲情综合五月天 | 大内密探零零性在线 | 粉嫩av淫片一区二区三区 | 国产在线观看免费人成视频 | 国内一区二区 | 99爱中文字幕高清视频 | 国产精品一级大片 | 神偷奶爸4中文版免费观看 国产黄色大片在线观看 | 狠狠躁夜夜躁人人爽天天不 | 国产一级AⅤ久久无码 | 欧美日一区二区 | 亚洲1区在线 | 又嫩又硬又黄又爽的视频 | 美国一级片在线 |