① k8s cronjob 啟動順序
k8s cronjob 啟動順序如下:
在K8S部署中,有時候容器啟動順序因為我們業務需要是有要求的,比如業務服務可能需要在 配置中心、注冊的中心 啟動後才啟動。
通過 initContainer 來阻塞啟動,如下以業務服務需要在apollo配置中心啟動後才啟動需求為例:
my-namespace為配置中心所在命名空間的名稱。svc.cluster.local為固定寫法。6166為我的配置中心的埠號。
/info為配置中心啟動後可以正常訪問的一個URL地址,這個根據你自己實際需求填寫,比如 /actuator/metrics 等等。
② k8s-pod-初探2
踩坑完畢,回到主線。
前面關於port的理解存在偏差,需要用實驗來確認port配置的含義。
k8s官方文檔對於對於這些配置項的解釋還是沒有很完善。下面是在其他博文中找到的解釋。
已知:
從k8s集群內部的宿主機(物理機、虛擬機)可以直接訪問pod的服務地址 ip:80
未知(需要測試):
1、同一區域網內,但沒有加入k8s集群的其他伺服器能否訪問pod的服務地址 ip:80---無法訪問
2、能否跳過pod直接訪問容器的服務地址 ip:80---沒查到ip
首先要知道容器的IP地址
可以看到上面的命令查出的結果是 - 無法看出ip,嘗試進入容器查看
然後我就沒轍了,不過根據linux系統的精神,所有內容都是文件,但是我google了好久也沒找到ip地址到底存在哪一個文件中。然後我就懷疑是不是一定要容器開放埠,ip地址才可以用docker inspect查詢,起了一個不開埠的容器,結果也是有ip的。後來問了一個底層開發的朋友,據說ip是不寫文件的。
那隻能先認為通過k8s啟動的容器其實是沒有容器ip的。
從側面看,也很有可能k8s啟動的容器確實沒有ip
3、訪問pod所在的主機的80埠能否返回相同的響應---無法訪問
從以上的信息來看,這個port配置應該和docker中暴露埠的意思是一樣的,例如下面的例子
來做一下實驗:
在我們之前的pod配置文件上增加配置,如下
結果和我們之前的猜測保持一致,增加ports的配置之後,訪問宿主機的ip:80也可以訪問到pod的內容了。
我這里pod ip 是 10.19.130.67,宿主機是 10.100.1.237。curl 10.19.130.67 和 curl 10.100.1.237 得到的結果是一樣的。正當我想再仔細看看的時候,伺服器又掛了,wc,只能明天找網管重啟了。
---第二天
昨天,我還想看看
1、關了這個pod之後是否就不能訪問了
啟動了2個pod如下,mynginx1沒有配置ports,mynginx2配置了ports。
當我關了pod-mynginx2之後訪問宿主機10.100.2.167應該就不能通了,結果居然是---能訪問到!
大吃一驚!結果ip弄錯了,宿主機不是10.100.2.167,而是10.100.1.237,犯了個低級錯誤。
結果如下:這回和預期的結果終於一樣了。
2、宿主機上是不是本身就開啟了nginx,所以恰巧就能訪問
確認宿主機上沒有開啟nginx
3、宿主機上的埠開放情況
使用netstat查看宿主機的埠開放,居然沒有發現80埠開著,好奇怪。
那如果在10.100.1.237宿主機上啟動一個nginx埠開在80,結果會是什麼樣子呢。
我居然啟動了,沒有埠已被佔用的報錯。現在把宿主機上的nginx的index頁面的內容改一下,看訪問10.100.1.237:80時,到底訪問的是哪一個nginx。
分別從集群內部3台伺服器和集群外部1台伺服器的機器取訪問10.100.1.237:80,訪問到的都是pod中的nginx。
會不會跟啟動順序有關,因為現在的情況是先啟動了pod-nignx,後啟動 宿主機-nginx,那現在將pod-nginx關閉,訪問10.100.1.237:80,看是啥。
集群內部3台伺服器和集群外部1台伺服器訪問10.100.1.237:80,結果一致,都是宿主機-nginx。
再啟動pod-nginx,查看結果。
訪問結果又變回pod-nginx了,4台伺服器結果一致。
再去看一下宿主機-nginx的日誌,有沒有報錯信息-----------沒有錯誤日誌
現在基本可以得出結論了:當pod和宿主機同時使用某一個埠時,不會因為沖突而報錯,但是pod會優先佔用埠,而與啟動順序無關。
至於為什麼會這樣,就不去深究了,畢竟精力有限,作為運維實施,了解到這樣子的程度應該夠用了。
③ K8S安裝和創建集群終極教程(單master多worker)
本文會以 最簡單 、 最直接 、 最完整 的方式記錄kubernetes(下面統稱K8S)單master多工作節點(worker nodes)的集群步驟
首先要簡單了解一下本文的3個核心概念:
內存建議至少4G
問:如何查看主機名?
答:執行命令hostname
問:如何修改主機名?
答:永久生效的做法:執行命令vi /etc/hostname,把第一行去掉(不能注釋掉,要去掉),然後重新寫上自定義的主機名(注意命名規范),保存並重啟後生效;
臨時生效的做法:執行以下命令
問:如何查看MAC地址?
答:執行命令ip link,然後看你的第一網卡
問:如何查看proct_uuid?
答:執行命令sudo cat /sys/class/dmi/id/proct_uuid
注意:30000-32767這個埠范圍是我們創建服務的埠必須要設置的一個范圍(如果設置范圍以外的會有限制提示並創建失敗),這是K8S規定的。
另外,如果你要直接關閉防火牆可以執行
⑥必須禁用Swap
Swap total大於0,說明Swap分區是開啟的
問:如何關閉Swap?
答:編輯文件/etc/fstab,在swap行前面加上#號注釋, 保存並重啟伺服器
再次查看分區狀態,已生效
常見的容器引擎(Container runtime,簡稱runtime):
本文使用的容器引擎是Docker
安裝完成後查看版本:
當出現可能跟Docker引擎相關的奇怪異常時可以嘗試把Docker卸載干凈並重新安裝,但一定要注意鏡像、容器、卷或配置文件這些是否需要備份。
下面記錄卸載Docker引擎的步驟:
①卸載 Docker Engine、CLI 和 Containerd 包:
②主機上的映像、容器、卷或自定義配置文件不會自動刪除。刪除所有鏡像、容器和卷:
③配置文件如果有不合法的字元時會導致啟動失敗,我們需要將其刪除然後重建
此時Docker引擎已卸載干凈
官網用的是谷歌的yum源,因為國內是連不上的,所以這里替換成阿里提供的yum源
①安裝
從安裝信息中可以看到版本號是1.22
Installing:
kubeadm x86_64 1.22.4-0 kubernetes 9.3 M
kubectl x86_64 1.22.4-0 kubernetes 9.7 M
kubelet x86_64 1.22.4-0 kubernetes 20 M
②啟動
這就是一個驅動程序,注意cgroup和cgroupfs不要混淆了
引用官方的一段話
「由於 kubeadm 把 kubelet 視為一個系統服務來管理,所以對基於 kubeadm 的安裝, 我們推薦使用 systemd 驅動,不推薦 cgroupfs 驅動。」
kubeadm默認是使用systemd 驅動,而我們的Docker默認驅動是cgroupfs(docker info可以查看),所以需要將Docker的驅動改成systemd
①編輯Docker配置文件
②重啟Docker服務
再次docker info查看驅動信息已變成了systemd
工作節點(worker nodes)的最小配置就到這里了
①鏡像源參數說明
默認情況下, kubeadm 會從 k8s.gcr.io 倉庫拉取鏡像,國內是拉不了的。官方文檔明確表示允許你使用其他的 imageRepository 來代替 k8s.gcr.io。
--image-repository 你的鏡像倉庫地址
接下來我找了一些國內的鏡像源,並簡單做了下分析
綜合上述統計,我選擇阿里雲的鏡像源
②ip地址范圍參數說明
--pod-network-cidr =192.168.0.0/16
注意:如果192.168.0.0/16已經在您的網路中使用,您必須選擇一個不同的pod網路CIDR,在上面的命令中替換192.168.0.0/16。
集群初始化命令:
因為我用的是演示機器,所以這里把完整的執行信息都貼出來方便查閱,平時工作中一定要注意保護好敏感的信息(我的ip地址范圍是自定義的便於下面的功能演示,另外初次init需要下載鏡像文件,一般需要等幾分鍾)
如上所示,集群初始化成功,此時一定要注意看上面執行結果最後的那部分操作提示,我已用標明了初始化成功後還需要執行的3個步驟
注意:如果init成功後發現參數需要調整,可以執行kubeadm reset,它的作用是盡最大努力恢復kubeadm init 或者 kubeadm join所做的更改。
To start using your cluster, you need to run the following as a regular user:
翻譯:開始使用集群前,如果你是普通用戶(非root),你需要執行以下的命令:
Alternatively, if you are the root user, you can run:
翻譯:或者,如果你使用的是root,你可以執行以下命令:
(注意:export只是臨時生效,意味著每次登錄你都需要執行一次)
網路配置配的就是Pod的網路,我的網路插件選用calico
cidr就是ip地址范圍,如果您使用 pod CIDR 192.168.0.0/16,請跳到下一步。
但本文中使用的pod CIDR是192.100.0.0/16,所以我需要取消對清單中的 CALICO_IPV4POOL_CIDR 變數的注釋,並將其設置為與我選擇的 pod CIDR 相同的值。(注意一定要注意好格式,注意對齊)
可根據需求自定義清單,一般不需要的就直接跳過這步
在所有的工作節點上執行join命令(復制之前初始化成功後返回的加入集群命令到所有的工作節點執行即可)
master上查看所有節點的狀態
到這里集群已經創建完成
最後我再安裝K8S的可視化界面kubernetes-dashboard,方便我們日常使用
①下載yaml文件
②修改yaml文件,新增type和nodePort,使服務能夠被外部訪問
③安裝並查看運行情況
④新建用戶
文件創建完成後保存並apply
⑤獲取Token,用於界面登錄
⑥登錄dashboard
192.168.189.128是我的master伺服器ip,另外要注意必須使用https,並且不能使用ie內核模式
復制⑤生成的token到輸入框,點擊登錄
dashboard安裝配置完成
問:如何在查看資源情況?
答:在master上執行以下命令可查看資源情況(-o wide是顯示更詳細的信息),
①查看所有節點
②查看所有命名空間
③查看命名空間下的pod
④查看所有命名空間的pod
⑤實時查看查看命名空間下的pod運行情況
問:kubeadm join 出現異常[ERROR Port-10250]: Port 10250 is in use,如何解決?
答:這是因為你之前join失敗過了,需要先執行kubeadm reset再重新join
問:虛擬機上測試時網卡突然消失如何解決(題外問題記錄)?
答:
①確認丟失的網卡信息,ens開頭(可選步驟)
ifconfig -a
②執行以下命令解決
問:如何查看K8S版本?
答:kubectl version
問:join命令忘記或者過期了怎麼辦?
答:
生成永不過期的
生成時效24小時的
問:Pod不斷重啟並且無其它報錯信息時怎麼辦?
答:這種情況通常是因為你的集群中只有master,沒有worker節點,master的創建默認是有污點的,即不允許調度新的Pod,如果你需要(當然這並不推薦),就需要刪除 master 上的污點。刪除污點可以執行以下命令,
它應該返回以下內容。
④ 超全K8s集群構建指南,建議收藏
1. 什麼是kubernetes
Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。
2. kubernetes核心組件說明
Kubernetes 集群中主要存在兩種類型的節點,分別是 master 節點 ,以及 minion 節點 。
Minion 節點是實際運行 Docker 容器的節點,負責和節點上運行的 Docker 進行交互,並且提供了代理功能。
Master 節點負責對外提供一系列管理集群的 API 介面,並且通過和 Minion 節點交互來實現對集群的操作管理。
apiserver :用戶和 kubernetes 集群交互的入口,封裝了核心對象的增刪改查操作,提供了 RESTFul 風格的 API 介面,通過 etcd 來實現持久化並維護對象的一致性。
scheler :負責集群資源的調度和管理,例如當有 pod 異常退出需要重新分配機器時,scheler 通過一定的調度演算法從而找到最合適的節點。
controller-manager :主要是用於保證 replicationController 定義的復制數量和實際運行的 pod 數量一致,另外還保證了從 service 到 pod 的映射關系總是最新的。
kubelet :運行在 minion 節點,負責和節點上的 Docker 交互,例如啟停容器,監控運行狀態等。
proxy :運行在 minion 節點,負責為 pod 提供代理功能,會定期從 etcd 獲取 service 信息,並根據 service 信息通過修改 iptables 來實現流量轉發(最初的版本是直接通過程序提供轉發功能,效率較低。),將流量轉發到要訪問的 pod 所在的節點上去。
etcd :key-value鍵值存儲資料庫,用來存儲kubernetes的信息的。
flannel :Flannel 是 CoreOS 團隊針對 Kubernetes 設計的一個覆蓋網路(Overlay Network)工具,需要另外下載部署。
我們知道當我們啟動 Docker 後會有一個用於和容器進行交互的 IP 地址,如果不去管理的話可能這個 IP 地址在各個機器上是一樣的,並且僅限於在本機上進行通信,無法訪問到其他機器上的 Docker 容器。
Flannel 的目的就是為集群中的所有節點重新規劃 IP 地址的使用規則,從而使得不同節點上的容器能夠獲得同屬一個內網且不重復的 IP 地址,並讓屬於不同節點上的容器能夠直接通過內網 IP 通信。
3. Kubernetes的核心概念
Pod
運行於Node節點上,若干相關容器的組合。Pod內包含的容器運行在同一宿主機上,使用相同的網路命名空間、IP地址和埠,能夠通過localhost進行通。
Pod是Kurbernetes進行創建、調度和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個Pod可以包含一個容器或者多個相關容器。
Replication Controller
Replication Controller用來管理Pod的副本,保證集群中存在指定數量的Pod副本。
集群中副本的數量大於指定數量,則會停止指定數量之外的多餘容器數量,反之,則會啟動少於指定數量個數的容器,保證數量不變。
Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。
Service
Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象。
Service提供了一個統一的服務訪問入口以及服務代理和發現機制,用戶不需要了解後台Pod是如何運行。
Label
Kubernetes中的任意API對象都是通過Label進行標識,Label的實質是一系列的K/V鍵值對。Label是Replication Controller和Service運行的基礎,二者通過Label來進行關聯Node上運行的Pod。
Node
Node是Kubernetes集群架構中運行Pod的服務節點(或agent)。
Node是Kubernetes集群操作的單元,用來承載被分配Pod的運行,是Pod運行的宿主機。
4. 前置條件設置
三台Centos7系統的虛擬機(1個master+2個node),三台機器上的防火牆,SELINUX全部關掉。我的實驗壞境可以上網,默認的YUM源就可以用。
5. 部署規劃
192.168.10.1 # master節點(etcd,kubernetes-master)
192.168.10.2 # node1節點(etcd,kubernetes-node,docker,flannel)
192.168.10.3 # node2節點(etcd,kubernetes-node,docker,flannel)
6. 開始安裝
step1:在master上安裝
yum install kubernetes-master etcd flannel -y
step2:在node上安裝
yum install kubernetes-node etcd flannel -y
step3:etcd集群配置
在master節點上編輯etcd配置文件
在node1節點上編輯etcd配置文件
在node2節點上編輯etcd配置文件
到此etcd集群就部署完了,然後每個節點上啟動
systemctl start etcd
step4:驗證
step6:啟動Master上的三個服務
step7:kubernetes node安裝
node2 節點重復上述操作
step8:分別啟動kubernetes node服務
7. 網路配置
因為kubernetes集群中網路部分是插件形式安裝的,我們這里選用flannel
上述安裝步驟已經install 了
為flannel創建分配的網路
8. 執行kubectl 命令檢查
在master上執行下面,檢查kubernetes的狀態
9. 常用排錯命令如下
⑤ K8s 集群搭建系列(三)K8s 啟動
到目前為止,通用的配置我們已經准備好了,剩下的步驟要分為兩部分進行,一個是控制平面的搭建,一個是從工作節點的搭建。由於我們目前只有一台虛擬機,如果要從頭開始搭建工作節點,那麼就太麻煩了。我們關機利用 VMware 克隆出(完整克隆)另一台機器來。還有一點需要注意的是,因為是完整克隆,所以 ip 地址也一並克隆了下來,所以我們一定要記得修改工作節點的 ip 地址。
至此,控制平面完成,我們開始准備工作節點。
集群到此已經搭建完成了,我們可以在控制平面查看節點信息
細心的話,你會發現 node-1 對應的 ROLES 為 <none>,我們可以為它分配個角色
K8s 的搭建目前已經全部完畢了,如果對 Istio 感興趣的話,可以關注 【K8s 集群搭建系列(四)你好 Istio】 。
⑥ K8S 網路詳解 3 CNI 與 CNM 網路模型
CNM 模型主要通過 Network Sanbox , Endpoint 和 Network 這三個朱建進行實現
CNI 的規范比較小巧。它規定了一個容器runtime和網路插件之間的簡單的契約。這個契約通過jsON的語法定義了CNI插件所需要提供的輸入和輸出。
一個容器可以被加入到被不同插件所驅動的多個網路之中。一個網路有自己對應的插件和唯一的名稱。CNI 插件需要提供兩個命令:一個用來將網路介面加入到指定網路,另一個用來將其移除。這兩個介面分別在容器被創建和銷毀的時候被調用。
CNI 模型只涉及2個概念: 容器和網路
對網路的設置通過插件進行實現, CNI 包括 CNI Plugin 和 IPAM ( IP address management) Plugin 兩類插件. CNI Plugin 負責為容器配置網路資源, IPAM plugin 負責對容器的IP 地址進行分配和管理 IPAM Plugin 作為 CNI plugin 的一部分, 與CNI plugin 一起工作.
CNI plugin 包括三個基本的介面定義, add check, version 這些介面的具體實現要求插件提供一個可執行的程序,在容器網路添加或刪除時進行調用, 以完成具體操作
1 add 介面參數定義如下
返回信息如下
2 刪除介面參數如下
3 檢查介面參數如下
CNI plugin 可以支持環境變數映射到對應的參數
例子
IPAM 可執行程序也處理傳遞給CNI plugin的參數,並返回包含ips routes dns 三段內容的結果
一個容器可以運行多個CNI plugin, 多個plugin 按照 配置文件中定義的先後順序從前到後執行, 刪除時, 則反序執行, 最後執行的plugin, 最先被刪除, 多網路配置的json 格式為
K8S 目前支持兩種網路插件的實現
啟用插件的命令, 字啟動kubelet 服務的啟動參數上設置下面的參數
在--network-plugin 為 cni 時, 還需下面兩個參數
目前開源的cni 插件有 calico canal cilium contiv flannel 等
如果文章對您有幫助,請點一下下面的 "喜歡"
⑦ k8s安裝部署
K8s集群搭建
1 centos版本信息查看
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
k8s集群機器關閉防火牆
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2 安裝必要的包
k8s集群安裝以下安裝包
[root@k8s-node ~]# yum -y install net-tools wget vim ntpd
[root@k8s-node ~]# systemctl enable ntpd
[root@k8s-node ~]# systemctl start ntpd
3配置hosts
[root@k8s-node ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.248.141 k8s-master
192.168.248.142 k8s-node
4 部署master節點
4.1 Master節點安裝必要的安裝包
[root@k8s-master ~]# yum -y install etcd
4.2更改/etc/etcd/etcd.conf配置文件
[root@k8s-master etcd]# cat /etc/etcd/etcd.conf | grep -v "^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="master"
ETCD_ADVERTISE_CLIENT_URLS= http://k8s-master:2379,http://k8s-master:4001
4.3設置開機啟動並驗證狀態
[root@k8s-master ~]#systemctl enable etcd
[root@k8s-master ~]#systemctl start etcd
etcd檢查
[root@k8s_master ~]# etcdctl -C http://k8s-master:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
[root@k8s_master ~]# etcdctl -C http://k8s-master:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
5 安裝部署docker環境(略)
6 安裝kubernetes
[root@k8s_master ~]# yum install kubernetes
安裝過程中報錯如下
Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
可以執行如下命令解決
1、查看安裝過的docker:yum list installed | grep docker
2、卸載docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
3、刪除容器鏡像:rm -rf /var/lib/docker
再次安裝kubernetes,安裝成功,而且會自動安裝docker
6.1修改apiserver服務的配置文件
[root@k8s-master kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.248.141:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
6.2修改config配置文件:
[root@k8s-master kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
設置開機啟動,開啟服務
[root@k8s-master ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheler docker
[root@k8s-master ~]#systemctl start kube-apiserver kube-controller-manager kube-scheler docker
6.3查看服務埠:
[root@k8s-master ~]# netstat –tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1273/master
tcp6 0 0 :::4001 :::* LISTEN 2126/etcd
tcp6 0 0 :::6443 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::10251 :::* LISTEN 3222/kube-scheler
tcp6 0 0 :::2379 :::* LISTEN 2126/etcd
tcp6 0 0 :::10252 :::* LISTEN 3221/kube-controlle
tcp6 0 0 :::111 :::* LISTEN 571/rpcbind
tcp6 0 0 :::8080 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::22 :::* LISTEN 998/sshd
tcp6 0 0 ::1:631 :::* LISTEN 996/cupsd
7部署node節點
7.1安裝docker(略)安裝k8s(略)
7.2 Node節點主機做以下配置:
修改config配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
修改kubelet配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.248.142"
KUBELET_API_SERVER="--api-servers=http://192.168.248.141:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
設置開機啟動、開啟服務
[root@k8s_client1 ~]# systemctl enable kubelet kube-proxy
[root@k8s_client1 ~]# systemctl start kubelet kube-proxy
查看埠:
[root@k8s_client1 ~]# netstat –ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1277/master
tcp6 0 0 :::4194 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10250 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10255 :::* LISTEN 3246/kubelet
tcp6 0 0 :::111 :::* LISTEN 575/rpcbind
tcp6 0 0 :::22 :::* LISTEN 1000/sshd
tcp6 0 0 ::1:631 :::* LISTEN 998/cupsd
Master上查看集群中的節點及節點狀態
[root@k8s-master kubernetes]# kubectl get node
NAME STATUS AGE
192.168.248.142 Ready 2m
[root@k8s-master kubernetes]# kubectl -s http://k8s-master:8080 get node
NAME STATUS AGE
192.168.248.142 Ready 2m
kubernetes集群搭建完成。
在k8s集群中創建pod,如果出現如下錯誤
其中最主要的問題是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)
解決方案:
查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (該鏈接就是上圖中的說明) 是一個軟鏈接,但是鏈接過去後並沒有真實的/etc/rhsm,所以需要使用yum安裝:
yum install *rhsm*
安裝完成後,執行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果依然報錯,可參考下面的方案:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
注釋:rpm2cpio命令用於將rpm軟體包轉換為cpio格式的文件
cpio命令主要是用來建立或者還原備份檔的工具程序,cpio命令可以復制文件到歸檔包中,或者從歸檔包中復文件。
-i 還原備份檔
-v 詳細顯示指令的執行過程
這兩個命令會生成/etc/rhsm/ca/redhat-uep.pem文件.
[root@k8s-node ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
在master節點新建pod並查看起狀態為正常
flannel是CoreOS提供用於解決Dokcer集群跨主機通訊的覆蓋網路工具。它的主要思路是:預先留出一個網段,每個主機使用其中一部分,然後每個容器被分配不同的ip;讓所有的容器認為大家在同一個直連的網路,底層通過UDP/VxLAN等進行報文的封裝和轉發。