Kubernetes學習文檔(二)

kubernetes 入門

我來深入學習下 kubernetes 的集群架構及環(huán)境搭建以及運行一個簡單 docker 容器叨粘。

2.1 K8S集群架構方案

kubernetes集群架構

Kubernetes 集群組件:

  • etcd 一個高可用的K/V鍵值對存儲和服務發(fā)現(xiàn)系統(tǒng)
  • flannel 實現(xiàn)跨主機的容器網(wǎng)絡的通信
  • kube-apiserver 提供kubernetes集群的API調用
  • kube-controller-manager 確保集群服務
  • kube-scheduler 調度容器窑业,分配到Node
  • kubelet 在Node節(jié)點上按照配置文件中定義的容器規(guī)格啟動容器
  • kube-proxy 提供網(wǎng)絡代理服務

Kubernetes 集群部署方案

如下是集群部署策略梁呈,1個master + 2個node曲横。存儲集群etcd是單點集群(真實環(huán)境不推薦此做法,需要集群)。網(wǎng)絡使用的是flannel虛擬二次網(wǎng)絡搬俊。


K8s集群部署架構
Kubernetes具有完備的集群管理能力:
  1. 包括多層次的安全防護和準入機制
  2. 多租戶應用支撐能力
  3. 透明的服務注冊和服務發(fā)現(xiàn)機制
  4. 內建智能負載均衡器
  5. 強大的故障發(fā)現(xiàn)和自我修復能力
  6. 服務滾動升級和在線擴容能力
  7. 可擴展的資源自動調度機制
  8. 以及多粒度的資源管理能力

同時,kubernetes提供了完善的管理工具蜒茄,這些工具涵蓋了包括開發(fā)唉擂、部署測試、運維監(jiān)控在內的各個環(huán)節(jié)檀葛。

在kubernetes中玩祟,service(服務)是分布式集群架構的核心,一個service對象擁有如下關鍵特征:
擁有一個唯一指定的名字(比如mysql-service)屿聋。
擁有一個虛擬IP(Cluster IP空扎、service IP或VIP)和端口號。
能夠提供某種遠程服務能力润讥。
被映射到了提供這種服務能力的一組容器應用上勺卢。

Kubernetes.io開發(fā)了一個交互式教程,通過WEB瀏覽器就能使用預先部署好的一個Kubernetes集群象对,快速體驗kubernetes的功能和應用場景黑忱。

鏈接:https://kubernetes.io/docs/tutorials/kubernetes-basics/

K8s官方下載地址:https://github.com/kubernetes

環(huán)境準備
節(jié)點 ip地址 操作系統(tǒng)
master 192.168.1.10 CentOS 7.3-x86_64
node1 192.168.1.11 CentOS 7.3-x86_64
node2 192.168.1.12 CentOS 7.3-x86_64
集群詳情
  • OS:CentOS Linux release 7.3.1611 (Core) 3.10.0-514.el7.x86_64
  • Kubernetes 1.6.0+(最低的版本要求是1.6)
  • Docker:建議使用 Docker CE
  • Etcd 3.3.10
  • Flannel 0.7.1 vxlan或者host-gw 網(wǎng)絡
  • TLS 認證通信 (所有組件,如 etcd勒魔、kubernetes master 和 node)
  • RBAC 授權
  • kubelet TLS BootStrapping
  • kubedns甫煞、dashboard、heapster(influxdb冠绢、grafana)抚吠、EFK(elasticsearch、fluentd弟胀、kibana) 集群插件
環(huán)境說明

在下面的步驟中楷力,我們將在三臺CentOS系統(tǒng)的物理機上部署具有三個節(jié)點的kubernetes1.12.3集群喊式。

角色分配如下:
Master:192.168.1.10

Node:192.168.1.11192.168.1.12

注意:192.168.1.10 這臺主機 master 和 node 復用萧朝。所有生成證書岔留、執(zhí)行 kubectl 命令的操作都在這臺節(jié)點上執(zhí)行。一旦 node 加入到 kubernetes 集群之后就不需要再登陸node節(jié)點了检柬。

1.1 集群環(huán)境搭建

本文檔介紹使用二進制部署最新 kubernetes v1.12.3 集群的所有步驟献联,而不是使用 kubeadm 等自動化方式來部署集群。

在部署的過程中何址,將詳細列出各組件的啟動參數(shù)里逆,它們的含義和可能遇到的問題。

部署完成后用爪,你將理解系統(tǒng)各組件的交互原理原押,進而能快速解決實際問題。

所以本文檔主要適合于那些有一定 kubernetes 基礎偎血,想通過一步步部署的方式來學習和了解系統(tǒng)配置班眯、運行原理的人。

1.2.1 組件版本和配置策略

1.2.1.1 組件版本

  • Kubernetes 1.12.3
  • Docker 18.09.0-ce
  • Etcd 3.3.10
  • Flanneld 0.10.0
    插件:
  • Coredns
  • Dashboard
  • Heapster (influxdb烁巫、grafana)
  • Metrics-Server
  • EFK (elasticsearch、fluentd宠能、kibana)
    鏡像倉庫:
  • docker registry

1.2.1.2 主要配置策略

kube-apiserver:
  • 使用節(jié)點本地 nginx 4 層透明代理實現(xiàn)高可用亚隙;
  • 關閉非安全端口 8080 和匿名訪問;
  • 在安全端口 6443 接收 https 請求违崇;
  • 嚴格的認證和授權策略 (x509阿弃、token、RBAC)羞延;
  • 開啟 bootstrap token 認證渣淳,支持 kubelet TLS bootstrapping;
  • 使用 https 訪問 kubelet伴箩、etcd入愧,加密通信;
kube-controller-manager:
  • 3 節(jié)點高可用嗤谚;
  • 關閉非安全端口棺蛛,在安全端口 10252 接收 https 請求;
  • 使用 kubeconfig 訪問 apiserver 的安全端口巩步;
  • 自動 approve kubelet 證書簽名請求 (CSR)旁赊,證書過期后自動輪轉;
  • 各 controller 使用自己的 ServiceAccount 訪問 apiserver椅野;
kube-scheduler:
  • 3 節(jié)點高可用终畅;
  • 使用 kubeconfig 訪問 apiserver 的安全端口籍胯;
kubelet:
  • 使用 kubeadm 動態(tài)創(chuàng)建 bootstrap token,而不是在 apiserver 中靜態(tài)配置离福;
  • 使用 TLS bootstrap 機制自動生成 client 和 server 證書杖狼,過期后自動輪轉;
  • 在 KubeletConfiguration 類型的 JSON 文件配置主要參數(shù)术徊;
  • 關閉只讀端口本刽,在安全端口 10250 接收 https 請求,對請求進行認證和授權赠涮,拒絕匿名訪問和非授權訪問子寓;
  • 使用 kubeconfig 訪問 apiserver 的安全端口;
kube-proxy:
  • 使用 kubeconfig 訪問 apiserver 的安全端口笋除;
  • 在 KubeProxyConfiguration 類型的 JSON 文件配置主要參數(shù)斜友;
  • 使用 ipvs 代理模式;
集群插件:
  • DNS:使用功能垃它、性能更好的 coredns鲜屏;
  • Dashboard:支持登錄認證;
  • Metric:heapster国拇、metrics-server洛史,使用 https 訪問 kubelet 安全端口;
  • Log:Elasticsearch酱吝、Fluend也殖、Kibana;
  • Registry 鏡像庫:docker-registry务热、harbor忆嗜;
    harbor私有鏡像倉庫:參考:https://github.com/goharbor/harbor

1.2.2 系統(tǒng)初始化和全局變量

1.2.2.1 集群機器

master:192.168.1.10
node1:192.168.1.11
node2:192.168.1.12

注意:

  1. 需要在所有機器上執(zhí)行本文檔的初始化命令;
  2. 需要使用具有 root 權限的賬號執(zhí)行這些命令崎岂。

1.2.2.2 主機名

設置永久主機名稱捆毫,然后重新登錄:
hostnamectl set-hostname master # 將 master 替換為當前主機名
設置的主機名保存在 /etc/hostname 文件中;
如果 DNS 不支持解析主機名稱冲甘,則需要修改每臺機器的 /etc/hosts 文件绩卤,添加主機名和 IP 的對應關系:

cat >> /etc/hosts <<EOF
192.168.1.10 master
192.168.1.11 node1
192.168.1.12 node2
EOF

1.2.2.3 添加 docker 賬戶

在每臺機器上添加 docker 賬戶:
useradd -m docker

1.2.2.4 無密碼 ssh 登錄其它節(jié)點

如果沒有特殊指明,本文所有操作均在 master 節(jié)點上執(zhí)行江醇,然后遠程分發(fā)文件和執(zhí)行命令省艳,所以需要添加該節(jié)點到其它節(jié)點的 ssh 信任關系。
設置 master 可以無密碼登錄所有節(jié)點的 root 賬戶:

ssh-keygen -t rsa
ssh-copy-id root@master
ssh-copy-id root@node1
ssh-copy-id root@node2

在這里卡了很久嫁审,也不知道之前搭建hadoop集群的時候為什么沒有遇到的問題在這里出現(xiàn)跋炕。使用ssh-copy-id時報ERROR: Host key verification failed.。由于找不到問題原因律适,只能耍賴將/etc/ssh/ssh_config內的 StrictHostKeyChecking 值改為 no來跳過報錯辐烂。

1.2.2.5 將可執(zhí)行文件路徑 /opt/k8s/bin 添加到 PATH 變量中

在每臺機器上添加環(huán)境變量:

echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
source /root/.bashrc

1.2.2.6 安裝依賴包

在每臺機器上安裝依賴包:

yum install -y epel-release
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
/usr/sbin/modprobe ip_vs
如果報Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again遏插。 請參考https://www.cnblogs.com/itor/p/11613783.html
  • ipvs 依賴 ipset;
  • ntp 保證各機器系統(tǒng)時間同步纠修;

1.2.2.7 關閉防火墻

在每臺機器上關閉防火墻胳嘲,清理防火墻規(guī)則,設置默認轉發(fā)策略:

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

1.2.2.8 關閉swap分區(qū)

如果開啟了 swap 分區(qū)扣草,kubelet 會啟動失敗(可以通過將參數(shù) --fail-swap-on 設置為 false 來忽略 swap on)了牛,故需要在每臺機器上關閉 swap 分區(qū)。同時注釋 /etc/fstab 中相應的條目辰妙,防止開機自動掛載 swap 分區(qū):

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.2.2.9 關閉 SELinux

關閉 SELinux鹰祸,否則后續(xù) K8S 掛載目錄時可能報錯 Permission denied:

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

1.2.2.10 關閉 dnsmasq(可選)

linux 系統(tǒng)開啟了 dnsmasq 后(如 GUI 環(huán)境),將系統(tǒng) DNS Server 設置為 127.0.0.1密浑,這會導致 docker 容器無法解析域名蛙婴,需要關閉它:

systemctl stop dnsmasq
systemctl disable dnsmasq

1.2.2.11 加載內核模塊

modprobe ip_vs_rr
modprobe br_netfilter

1.2.2.12 優(yōu)化內核參數(shù)

這一步如果執(zhí)行有一些報錯不用理會,繼續(xù)往下執(zhí)行尔破。

cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空間街图,只有當系統(tǒng) OOM 時才允許使用它
vm.overcommit_memory=1 # 不檢查物理內存是否夠用
vm.panic_on_oom=0 # 開啟 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
  • 必須關閉 tcp_tw_recycle,否則和 NAT 沖突懒构,會導致服務不通餐济;
  • 關閉 IPV6,防止觸發(fā) docker BUG胆剧;

1.2.2.13 設置系統(tǒng)時區(qū)

# 調整系統(tǒng) TimeZone
timedatectl set-timezone Asia/Shanghai

# 將當前的 UTC 時間寫入硬件時鐘
timedatectl set-local-rtc 0

# 重啟依賴于系統(tǒng)時間的服務
systemctl restart rsyslog 
systemctl restart crond

1.2.2.14 更新系統(tǒng)時間

ntpdate cn.pool.ntp.org

1.2.2.15 關閉無關的服務

systemctl stop postfix && systemctl disable postfix

1.2.2.16 設置 rsyslogd 和 systemd journal

systemd 的 journald 是 Centos 7 缺省的日志記錄工具絮姆,它記錄了所有系統(tǒng)、內核赞赖、Service Unit 的日志。
相比 systemd冤灾,journald 記錄的日志有如下優(yōu)勢:

  1. 可以記錄到內存或文件系統(tǒng)前域;(默認記錄到內存,對應的位置為 /run/log/jounal)
  2. 可以限制占用的磁盤空間韵吨、保證磁盤剩余空間匿垄;
  3. 可以限制日志文件大小、保存的時間归粉;

journald 默認將日志轉發(fā)給 rsyslog椿疗,這會導致日志寫了多份,/var/log/messages 中包含了太多無關日志糠悼,不方便后續(xù)查看届榄,同時也影響系統(tǒng)性能。

mkdir /var/log/journal # 持久化保存日志的目錄
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盤
Storage=persistent

# 壓縮歷史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空間 10G
SystemMaxUse=10G

# 單日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存時間 2 周
MaxRetentionSec=2week

# 不將日志轉發(fā)到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

1.2.2.17 創(chuàng)建相關目錄

創(chuàng)建目錄:
mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

1.2.2.18 檢查系統(tǒng)內核和模塊是否適合運行 docker (僅適用于 linux 系統(tǒng)) 可選

curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh
bash ./check-config.sh
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末倔喂,一起剝皮案震驚了整個濱河市铝条,隨后出現(xiàn)的幾起案子靖苇,更是在濱河造成了極大的恐慌,老刑警劉巖班缰,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贤壁,死亡現(xiàn)場離奇詭異,居然都是意外死亡埠忘,警方通過查閱死者的電腦和手機脾拆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莹妒,“玉大人名船,你說我怎么就攤上這事《穑” “怎么了包帚?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長运吓。 經(jīng)常有香客問我渴邦,道長,這世上最難降的妖魔是什么拘哨? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任谋梭,我火速辦了婚禮,結果婚禮上倦青,老公的妹妹穿的比我還像新娘瓮床。我一直安慰自己,他們只是感情好产镐,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布隘庄。 她就那樣靜靜地躺著,像睡著了一般癣亚。 火紅的嫁衣襯著肌膚如雪丑掺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天述雾,我揣著相機與錄音街州,去河邊找鬼。 笑死玻孟,一個胖子當著我的面吹牛唆缴,可吹牛的內容都是我干的。 我是一名探鬼主播黍翎,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼面徽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了匣掸?” 一聲冷哼從身側響起斗忌,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤质礼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后织阳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眶蕉,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年唧躲,在試婚紗的時候發(fā)現(xiàn)自己被綠了造挽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡弄痹,死狀恐怖饭入,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情肛真,我是刑警寧澤谐丢,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蚓让,受9級特大地震影響乾忱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜历极,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一窄瘟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趟卸,春花似錦蹄葱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邻邮,卻和暖如春竣况,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饶囚。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工帕翻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鸠补,地道東北人萝风。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像紫岩,于是被迫代替她去往敵國和親规惰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容