OpenShift4中容器運行時的前世今生

2021-01-13 大魏分享

閱讀提示|本文大概2000字   閱讀需要20分鐘

CRI-O的誕生

開源界已經轉向open containers 已有一段時間了。無論是在Kubernetes還是更低層中,容器標準都在各個層面孕育了創新生態系統。


一切始於2015年6月成立「 Open Containers Initiative」。這項早期工作標準化了容器映像和運行時規範。這些保證了工具可以針對容器映像以及如何運行它們以單一格式進行標準化。後來,添加了分發規範,允許各地的用戶自由共享容器映像。


接下來,Kubernetes社區在Container Runtime Interface (CRI).的可插拔接口上進行了標準化。這使Kubernetes用戶可以插入除Docker之外的其他容器引擎。


來自Red Hat和Google的工程師認識到市場對容器引擎的需求,該容器引擎可以通過CRI協議接受來自Kubelet的請求,並啟動符合上述OCI規範的容器。CRI-O誕生了。

CRI-O和CoreOS的創新

 

使用OpenShift 4時,默認容器引擎已從Docker遷移到CRI-O,從而提供了精簡,穩定的容器運行時,該運行時與Kubernetes步調一致。這極大地簡化了集群的支持和配置。作為OpenShift 4的一部分,容器引擎和主機的所有配置和管理都將自動化。


使用OpenShift 4,無需登錄到各個容器主機並安裝容器引擎、配置存儲、配置註冊表伺服器以進行搜索或配置網絡。Kubernetes始終使用戶能夠通過定義所需的狀態並使用Controller來確保實際狀態與定義的狀態儘可能匹配,從而管理應用程式。這種定義的狀態,實際狀態方法對於開發人員和操作人員都是強大的。開發人員可以定義所需的狀態,然後將其作為YAML或JSON文件交給操作員,然後操作員可以使用完全相同的定義實例化生產環境中的應用程式。


通過在平臺中使用Operators,OpenShift 4為管理RHEL CoreOS和CRI-O帶來了定義的狀態,實際狀態範例。作業系統和容器引擎的配置和版本控制任務由 Machine Config Operator(MCO)自動執行。MCO通過以全自動方式處理安裝的最後一英裡以及Day2的操作,極大地簡化了集群管理員的工作。這使OpenShift 4成為真正的雲平臺。稍後再詳細介紹。


運行容器

 

自版本3.7起,用戶可以選擇在OpenShift中使用CRI-O(作為技術預覽版),而從版本3.9(通常)(受支持)開始使用。從3.10版開始,紅帽還一直在OpenShift Online中針對生產工作負載運行CRI-O。這為CRI-O團隊提供了在大型Kubernetes集群中大規模運行容器的豐富經驗。要了解Kubernetes如何使用CRI-O的基本概念,請看以下架構圖:

CRI-O通過在供應新節點以及發布新版本的OpenShift時保持整個頂層處於鎖定狀態,從而簡化了新容器主機的製造。一起修訂整個平臺可以進行事務更新/回滾,還可以防止容器主機內核,容器引擎,Kubelet和Kubernetes Master之間的依賴關係出現死鎖。當平臺的所有組件都一起受版本控制時,從A點到B點總會有一條清晰的路徑。這將導致更輕鬆的更新,更好的安全性,更好的性能責任制以及更少的升級和新版本成本。


如前所述,利用Machine Config Operator在OpenShift 4中管理容器主機和容器引擎可以實現Kubernetes前所未有的更高水平的自動化水平。為了演示,讓我們展示如何將更改部署到crio.conf文件。不要迷失術語,只專注於結果。


為了演示,讓我們創建一個所謂的容器運行時配置。可以將其視為代表CRI-O的配置的Kubernetes資源。實際上,它是MachineConfig的專用版本,它表示在OpenShift集群中部署到RHEL CoreOS計算機的任何配置。


已經實現了稱為ContainerRuntimeConfig的自定義資源,以使集群管理員可以輕鬆調整CRI-O。它甚至功能強大到可以僅根據所謂的MachineConfigPool將其應用於某些節點。可以將這視為一組功能相同的機器。


首先,CRIO的配置文件在OCP節點的/etc/crio/crio.conf中。OCP4的Master和Worker節點默認使用CoreOS,這是不可變基礎架構。因此,我們如果想改這個配置文件的內容,通過CRD的方式修改即可。我們查看這個配置文件中的配置內容:

[root@master-0 ~]# cat  /etc/crio/crio.conf |grep -v "#"  | sed '/^$/d'

[crio]

log_dir = "/var/log/crio/pods"

version_file = "/var/run/crio/version"

version_file_persist = "/var/lib/crio/version"

[crio.api]

listen = "/var/run/crio/crio.sock"

host_ip = ""

stream_address = ""

stream_port = "10010"

stream_enable_tls = false

stream_tls_cert = ""

stream_tls_key = ""

stream_tls_ca = ""

grpc_max_send_msg_size = 16777216

grpc_max_recv_msg_size = 16777216

[crio.runtime]

default_runtime = "runc"

no_pivot = false

conmon = "/usr/libexec/crio/conmon"

conmon_cgroup = "pod"

conmon_env = [

    "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

]

default_env = [

    "NSS_SDB_USE_CACHE=no",

]

selinux = true

seccomp_profile = ""

apparmor_profile = "crio-default"

cgroup_manager = "systemd"

default_capabilities = [

    "CHOWN",

    "DAC_OVERRIDE",

    "FSETID",

    "FOWNER",

    "NET_RAW",

    "SETGID",

    "SETUID",

    "SETPCAP",

    "NET_BIND_SERVICE",

    "SYS_CHROOT",

    "KILL",

]

default_sysctls = [

]

additional_devices = [

]

hooks_dir = [

    "/etc/containers/oci/hooks.d",

]

default_mounts = [

]

pids_limit = 1024

log_size_max = -1

log_to_journald = false

container_exits_dir = "/var/run/crio/exits"

container_attach_socket_dir = "/var/run/crio"

bind_mount_prefix = ""

read_only = false

log_level = "info"

uid_mappings = ""

gid_mappings = ""

ctr_stop_timeout = 0

manage_network_ns_lifecycle = false

[crio.runtime.runtimes.runc]

runtime_path = ""

runtime_type = "oci"

runtime_root = "/run/runc"

[crio.image]

default_transport = "docker://"

global_auth_file = "/var/lib/kubelet/config.json"

pause_image = "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:1428f0d9146362d35d6bced979aca00a669ef89903014b0764b5191c18da5ff0"

pause_image_auth_file = "/var/lib/kubelet/config.json"

pause_command = "/usr/bin/pod"

signature_policy = ""

image_volumes = "mkdir"

[crio.network]

network_dir = "/etc/kubernetes/cni/net.d/"

plugin_dirs = [

    "/var/lib/cni/bin",

]

[crio.metrics]

enable_metrics = true

metrics_port = 9537


我們通過crd的方式,在K8S層面修改配置中的pidsLimit(初始為1024)和logLevel(初始為info):

[root@master-0 ~]# cat  /etc/crio/crio.conf |grep -v "#"  | sed '/^$/d' |grep -i  log

log_level = "info"

[root@master-0 ~]# cat  /etc/crio/crio.conf |grep -v "#"  | sed '/^$/d' |grep -i pids

pids_limit = 1024


vi ContainerRuntimeConfig.yaml

apiVersion: machineconfiguration.openshift.io/v1
kind: ContainerRuntimeConfig
metadata:
name: set-log-and-pid
spec:
machineConfigPoolSelector:
matchLabels:
debug-crio: config-log-and-pid
containerRuntimeConfig:
pidsLimit: 2048
logLevel: debug

現在,將其提交給Kubernetes集群並驗證它是否已創建。注意,它看起來與任何其他Kubernetes資源一樣:

oc create -f ContainerRuntimeConfig.yaml
oc get ContainerRuntimeConfig

NAME              AGE
set-log-and-pid 22h

創建ContainerRuntimeConfig之後,我們必須修改其中一個MachineConfigPool,以告訴Kubernetes我們希望將

此配置應用於集群中的特定計算機組。在這種情況下,我們將為Master修改MachineConfigPool:

oc edit MachineConfigPool/master

...
metadata:
creationTimestamp: 2019-04-10T23:42:28Z
generation: 1
labels:
debug-crio: config-log-and-pid
operator.machineconfiguration.openshift.io/required-for-upgrade: ""

加在這個位置:


此時,MCO開始為群集製造一個新的crio.conf文件。

ContainerRuntimeConfig只是MachineConfig的專用版本,因此我們可以通過查看呈現的MachineConfigs

來查看輸出:

oc get MachineConfigs | grep rendered

rendered-master-c923f24f01a0e38c77a05acfd631910b 4.0.22-201904011459-dirty 2.2.0 16h
rendered-master-f722b027a98ac5b8e0b41d71e992f626 4.0.22-201904011459-dirty 2.2.0 4m
rendered-worker-9777325797fe7e74c3f2dd11d359bc62 4.0.22-201904011459-dirty 2.2.0 16h

我們可以查看一個Wroker節點最多運行容器的適量:

python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" $(oc get MachineConfig/rendered-master-f722b027a98ac5b8e0b41d71e992f626 -o YAML | grep -B4 crio.conf | grep source | tail -n 1 | cut -d, -f2) | grep pid

pids_limit = 2048

現在,驗證它是否已部署到主節點。首先,獲取集群中節點的列表:

oc get node | grep master

Output:

ip-10-0-135-153.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1

ip-10-0-154-0.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1

ip-10-0-166-79.us-east-2.compute.internal Ready master 23h v1.12.4+509916ce1

檢查部署的文件。您會注意到它已使用我們在ContainerRuntimeConfig資源中指定的新pid和debug指令

進行了更新。 

oc debug node/ip-10-0-135-153.us-east-2.compute.internal -- cat /host/etc/crio/crio.conf | egrep 'debug||pid』

...
pids_limit = 2048
...
log_level = "debug"


所有這些更改都是在不運行SSH的情況下對群集進行的。一切都是通過與Kuberentes大師溝通來完成的。僅主節點配置有這些新參數。工作節點未更改,證明了已定義狀態的值,Kubernetes應用於容器主機和具有可互換零件的容器引擎的實際狀態方法。


上面的演示重點介紹了對具有三個工作節點的小型OpenShift Container Platform 4集群或具有3000的大型生產實例進行更改的能力。這兩種方法的工作量相同-數量不多-一個ContainerRuntimeConfig文件和一個標籤更改到MachineConfigPool。而且,您可以在整個生命周期內使用任何版本的基於OpenShift Container Platform 4.X的Kubernetes。那是強大的。


通常,技術公司的步伐如此之快,以至於我們無法很好地解釋為什麼我們為基礎組件選擇技術。容器引擎一直以來都是用戶直接與之交互的組件。由於容器的流行合法地從容器引擎開始,因此用戶經常會對它們產生個人興趣。值得一提的是,為什麼紅帽選擇了CRI-O。容器已經發展,現在的重點完全放在業務流程上,我們發現CRI-O可以在OpenShift 4中提供最佳體驗。


相關焦點

  • 《波米叔叔的前世今生》:講述前世今生輪迴
    最近,泰國鬼才導演阿彼察邦.韋拉斯花古 (Apichatpong Weerasethakul)的作品《波米叔叔的前世今生》(Uncle Boonmee who can Recall his Past Lives),更榮獲康城影展最高榮譽金棕櫚大獎,並同獲香港亞洲電影節別注電影,十分「威水」。
  • 《待到重逢時》:泰國腐劇終於對前世今生下手了!
    當然,在這一系列好看的劇中,令小編印象最深刻的一部就是今天要討論的這部《待到重逢時》了。這部劇,不說其他,光是前世今生的劇情就足以令人印象深刻。在看了眾多古裝國產劇裡的主人公們關於前世今生的故事後,突然遇到一部腐劇也加上了這樣的劇情設定,還是挺吸引人去一睹為快的。
  • 今生的夫妻是前世情人,今生的情人是前世夫妻:善待每一份相遇!
    作者:胡楊映月情人之所以對你柔情似水,之所以是浪漫溫柔的代名詞,之所以讓你感覺愛得百轉柔腸,之所以讓你刻骨銘心,是因為你們是前世的夫妻。今生之所以尋你而來,只因為前世的一份緣還沒有盡,所以今生來續前緣,是來還債的。
  • 《俠隱閣》前世今生MOD怎麼用 前世今生MOD及使用方法教學
    下面請看由「mzm1111」帶來的《俠隱閣》前世今生MOD及使用方法教學,希望大家能夠... 《俠隱閣》可以通過打MOD來增強遊戲的趣味性,前世今生MOD就可以讓玩家初始就擁有很強的勢力,還增加了往外的玩法。
  • 足球的前世今生
    足球的前世今生作為一名骨灰級球迷,倘若不了解足球的前世今生,那無異於自打耳光。眾所周知,足球是一項有著深厚歷史淵源的體育運動,源遠流長而歷久彌新,而現代足球起源於今天的英國。話說在12世紀前後,北歐海盜橫行西歐,丹麥和英國發生了衝突,兩國的關係不斷惡化。
  • 震撼:前世今生的照片比對 輪迴不可思議
    遺憾的是,當天去的幾個人大多沒找到自己的照片,也包括我,略微有些失落。不過後來想想,上輩子那麼胖,還是個女的肯定不願意照相,能躲就躲了。  回到家,把照片整理了下,大家一起來看看人轉世後的相貌對比。右邊是前世照片,曾經是女校的教務主任;左邊是今生照片,某部門副總編,現自行創業,兩世與我都是很好的同事與朋友。
  • 北新涇的「前世今生」……
    北新涇的「前世今生」…… 2020-10-05 16:30 來源:澎湃新聞·澎湃號·政務
  • 妖怪名單之前世今生:尋找前世今生,龍族公主等你來撩!
    身為四大後宮之一的龍三元,與封夕的前世阿瘋有過一段前世情緣。人類與龍族的跨種族愛情感動了無數玩家們,但無奈他們沒有逃開時間的流逝,阿瘋最終壽元耗盡死去。而龍三元卻一直守著「等她長大了,阿瘋就娶她」的承諾,在今世一直默默守護的封夕。在《妖怪名單之前世今世》手遊中,跨越了前世今生,不同時期的龍三元也和各位玩家們見面啦!
  • 泰劇《待到重逢時》一根紅線牽引前世今生,夢裡夢外註定與你相遇
    這是一部小編看的重頭到尾都是淚點的電視劇,一悲一喜結束也是開始,四個人演繹了同一對相愛的人的故事,他們的前世今生,這就是今天小編分享的《待到重逢時》,他是一部關於一對相愛的人前世今生終於在一起的故事。《待到重逢時》是由New Siwaj Sawatmaneekul執導,邦沙敦·西賓達、提迪瓦·立帕拉賽、南思睿、諾帕考·德查帕塔納坤、瓦魯特·查瓦力朱吉翁、諾帕努·甘塔柴等主演的泰國電視劇,外國人的名字真的太複雜了,反正小編搞不懂啦,就這裡就隨便介紹下哈。
  • 精選5本前世今生文,無論前世,還是今生,我想一直在你身邊!
    今天為寶寶們整理了5本前世今生文,快一起來看看吧。如果寶寶們想看什麼類型的小說,可以在留言區告訴九九哦,九九會整理分享給大家。01《洞房前還有遺言嗎》作者:且墨<文案簡介>卿如是:我是你的祖宗,我們之間是不會有好結果的,這樣是會遭天譴的。
  • 你前世欠了多少情債?前世姻緣註定今生的相遇,宿世情深該如何把握?
    前世你對我有恩,今生我便以身相許 如果雙方前世有恩情,今生相會便能喜結良緣,這樣的夫妻緣,報恩的一方能夠為了對方無怨無悔的奉獻,最能美滿幸福。
  • 《瀋陽北大營》 梳理北大營的前世今生
    《瀋陽北大營》 梳理北大營的前世今生 瀋陽晚報
  • 你問佛:為什麼,我今生很苦?佛流下一滴淚:前世的債,今生的緣
    你對佛說:為什麼,我今生很苦?佛流下一滴淚,答:世間萬事萬物,都在因果之中。原來,今生所有的苦難與煩惱,幸福與安樂,都是前世修來的。在前世,你們可能是是仇人,但命運卻偏偏安排你們今生相遇:不是前世的結下的冤孽,今世就不會相聚。
  • 催眠:前世今生—我與女兒的約定
    你相信——「前世今生」嗎?一個聽上去無比玄妙而又浪漫的詞,它究竟是不是真的存在?致力於此的人至今仍在不斷探究。但是在心理諮詢界,利用前世回溯治療有效的案例數不勝數,所以不論真實與否,單從療愈效果上來說,前世回溯治療被證實從根源上是有效的。
  • 一二三航空的前世今生
    一、一二三航空的前世今生據悉,一二三航空有限公司前身為東方公務航空(東方公務航空作為東方航空旗下的全資子公司,目前執管十多架公務機,在專機、公務機、客貨包機、急救飛行的地面代理服務方面有著十多年的經驗。),擁有民航局頒發的CCA-R135部、CCAR-91部運行資質。
  • 梳妝檯的前世今生
    梳妝檯前世今生「當窗理雲鬢,對鏡貼花黃」,早自南北朝就已是日常。女子靜坐在典雅的梳妝檯旁,輕輕地梳理頭髮,看著鏡子中的容顏,一種欲語還休的惆悵漂浮在空氣中,嫣然一笑更是傾國傾城。因此我國古代婦女非常注重梳妝打扮,也對化妝用具十分講究。梳妝檯上總少不了各式各樣雕刻精美的鏡子和梳妝匣。
  • 大波束電臺|「譚」業務講衛星①:直播衛星的前世今生
    「譚」業務講衛星:直播星的前世今生.mp303:57來自中國衛通直播衛星的前世今生直播衛星是向公眾直接播出視頻和音頻廣播節目的專用通信衛星。2011年後,直播衛星用戶數快速增長,為保障1億多直播衛星用戶安全運行,於2017年6月19日發射了中星9A衛星(東經101.4度)。目前中星9號和中星9A兩顆直播衛星組成了我國直播衛星空間段系統。
  • 五本前世今生的甜文:前塵往事難忘記,今生依然愛你
    1、《命中未定》作者:時久短書評:本文講述了一個前世今生的四角戀愛故事。男二和女二是命中注定的愛侶,生生世世相戀。女主每一世都對男二一見鍾情,不擇手段也要得到他。現代的女主通過夢境和第一世的自己合謀迫害女二,卻還是斬不斷她和男二的天賜姻緣。在拆散他們的過程中,女主漸漸迷失本心,卻不知道在她追逐男二的同時,男主也在追逐每一世的她。
  • 時序資料庫的前世今生
    時序資料庫的前世今生 華為雲社區技術火 發表於 2020-12-17 17:51:10   時序資料庫忽然火了起來
  • 短短今生一面鏡,前世多少香火緣
    有緣,今生才會相遇南無阿彌陀佛    南無阿彌陀佛   南無阿彌陀佛    南無阿彌陀佛