學(xué)習(xí)kubernetes(一):kubeasz部署基于Flannel的k8s測(cè)試環(huán)境

參考http://aspirer.wang/?p=1205锦庸,使用kubeasz部署kubernetes,只涉及容器在節(jié)點(diǎn)間通信

測(cè)試環(huán)境

準(zhǔn)備三臺(tái)虛擬機(jī)(CentOS7.5)

k8s-master:10.25.151.100
k8s-node-1:10.25.151.103
k8s-node-2:10.25.151.104

準(zhǔn)備工作(主節(jié)點(diǎn)上進(jìn)行)

  • 下載安裝必要軟件
# yum install git python-pip -y
# pip install pip --upgrade -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# pip install --no-cache-dir ansible -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
  • 配置密鑰并輸入登錄各個(gè)節(jié)點(diǎn)的root密碼
# ssh-keygen -t rsa -b 2048 (三個(gè)回車)
# ssh-copy-id 10.25.151.100
# ssh-copy-id 10.25.151.101
# ssh-copy-id 10.25.151.102
  • 獲取kubeasz
# git clone https://github.com/gjmzj/kubeasz.git
# ll
total 213968
-rw-------. 1 root root      1518 Mar 26 02:18 anaconda-ks.cfg
drwxr-xr-x. 2 root root      4096 Mar 11 09:02 bin
-rw-r--r--. 1 root root 219093842 Mar 27  2019 k8s.1-13-4.tar.gz
drwxr-xr-x. 3 root root        36 Mar 26 04:29 kubeasz

  • 拷貝文件
# mkdir -p /etc/ansible
# mv kubeasz/* /etc/ansible
# tar zxvf k8s.1-13-4.tar.gz 
bin/
bin/loopback
bin/kubelet
bin/docker-init
bin/docker-compose
bin/docker-proxy
bin/portmap
bin/containerd-shim
bin/etcd
bin/containerd
bin/helm
bin/cfssl-certinfo
bin/kube-proxy
bin/kube-controller-manager
bin/cfssljson
bin/bridge
bin/ctr
bin/kube-apiserver
bin/docker
bin/etcdctl
bin/kubectl
bin/dockerd
bin/cfssl
bin/calicoctl
bin/readme.md
bin/host-local
bin/kube-scheduler
bin/runc
bin/flannel
#
# mkdir -p /etc/ansible
# mv bin/* /etc/ansible/bin
mv: overwrite ‘/etc/ansible/bin/readme.md’? y
#
  • 配置ansible的hosts文件
# cd /etc/ansible
# cp example/hosts.allinone.example hosts
編輯后
# cat hosts 
# 集群部署節(jié)點(diǎn):一般為運(yùn)行ansible 腳本的節(jié)點(diǎn)
# 變量 NTP_ENABLED (=yes/no) 設(shè)置集群是否安裝 chrony 時(shí)間同步
[deploy]
10.25.151.100 NTP_ENABLED=no

# etcd集群請(qǐng)?zhí)峁┤缦翹ODE_NAME,注意etcd集群必須是1,3,5,7...奇數(shù)個(gè)節(jié)點(diǎn)
[etcd]
10.25.151.100 NODE_NAME=etcd1

[kube-master]
10.25.151.100

[kube-node]
10.25.151.103
10.25.151.104

# 參數(shù) NEW_INSTALL:yes表示新建,no表示使用已有harbor服務(wù)器
# 如果不使用域名募舟,可以設(shè)置 HARBOR_DOMAIN=""
[harbor]
#192.168.1.8 HARBOR_DOMAIN="harbor.yourdomain.com" NEW_INSTALL=no

# 【可選】外部負(fù)載均衡档址,用于自有環(huán)境負(fù)載轉(zhuǎn)發(fā) NodePort 暴露的服務(wù)等
[ex-lb]
#192.168.1.6 LB_ROLE=backup EX_VIP=192.168.1.250
#192.168.1.7 LB_ROLE=master EX_VIP=192.168.1.250

[all:vars]
# ---------集群主要參數(shù)---------------
#集群部署模式:allinone, single-master, multi-master
DEPLOY_MODE=allinone

#集群 MASTER IP盹兢,自動(dòng)生成
MASTER_IP="{{ groups['kube-master'][0] }}"
KUBE_APISERVER="https://{{ MASTER_IP }}:6443"

# 集群網(wǎng)絡(luò)插件,目前支持calico, flannel, kube-router, cilium
CLUSTER_NETWORK="flannel"

# 服務(wù)網(wǎng)段 (Service CIDR)守伸,注意不要與內(nèi)網(wǎng)已有網(wǎng)段沖突
SERVICE_CIDR="10.68.0.0/16"

# POD 網(wǎng)段 (Cluster CIDR)绎秒,注意不要與內(nèi)網(wǎng)已有網(wǎng)段沖突
CLUSTER_CIDR="172.20.0.0/16"

# 服務(wù)端口范圍 (NodePort Range)
NODE_PORT_RANGE="20000-40000"

# kubernetes 服務(wù) IP (預(yù)分配,一般是 SERVICE_CIDR 中第一個(gè)IP)
CLUSTER_KUBERNETES_SVC_IP="10.68.0.1"

# 集群 DNS 服務(wù) IP (從 SERVICE_CIDR 中預(yù)分配)
CLUSTER_DNS_SVC_IP="10.68.0.2"

# 集群 DNS 域名
CLUSTER_DNS_DOMAIN="cluster.local."

# ---------附加參數(shù)--------------------
#默認(rèn)二進(jìn)制文件目錄
bin_dir="/opt/kube/bin"

#證書目錄
ca_dir="/etc/kubernetes/ssl"

#部署目錄尼摹,即 ansible 工作目錄
base_dir="/etc/ansible"
#
  • 確認(rèn)節(jié)點(diǎn)網(wǎng)絡(luò)可達(dá)
# ansible all -m ping
10.25.151.104 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.25.151.100 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
10.25.151.103 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
  • 查看playbook
# ll
total 88
-rw-r--r--.  1 root root   499 Mar 26 04:19 01.prepare.yml
-rw-r--r--.  1 root root    58 Mar 26 04:19 02.etcd.yml
-rw-r--r--.  1 root root    87 Mar 26 04:19 03.docker.yml
-rw-r--r--.  1 root root   532 Mar 26 04:19 04.kube-master.yml
-rw-r--r--.  1 root root    72 Mar 26 04:19 05.kube-node.yml
-rw-r--r--.  1 root root   346 Mar 26 04:19 06.network.yml
-rw-r--r--.  1 root root    77 Mar 26 04:19 07.cluster-addon.yml
-rw-r--r--.  1 root root  1521 Mar 26 04:19 11.harbor.yml
-rw-r--r--.  1 root root   411 Mar 26 04:19 22.upgrade.yml
-rw-r--r--.  1 root root  1394 Mar 26 04:19 23.backup.yml
-rw-r--r--.  1 root root  1391 Mar 26 04:19 24.restore.yml
-rw-r--r--.  1 root root  1723 Mar 26 04:19 90.setup.yml
-rw-r--r--.  1 root root  5941 Mar 26 04:19 99.clean.yml
-rw-r--r--.  1 root root 10283 Mar 26 04:19 ansible.cfg
drwxr-xr-x.  2 root root  4096 Mar 26 04:32 bin
drwxr-xr-x.  4 root root    36 Mar 26 04:19 dockerfiles
drwxr-xr-x.  8 root root    92 Mar 26 04:19 docs
drwxr-xr-x.  2 root root    47 Mar 26 04:19 down
drwxr-xr-x.  2 root root   254 Mar 26 04:19 example
-rw-r--r--.  1 root root  1884 Mar 26 04:34 hosts
drwxr-xr-x. 14 root root   218 Mar 26 04:19 manifests
drwxr-xr-x.  2 root root   245 Mar 26 04:19 pics
-rw-r--r--.  1 root root  5056 Mar 26 04:19 README.md
drwxr-xr-x. 22 root root  4096 Mar 26 04:19 roles
drwxr-xr-x.  2 root root   272 Mar 26 04:19 tools
[root@k8s-master ansible]# 

利用ansible集群安裝

  • 可以分步安裝(某步失敗可以重復(fù)再執(zhí)行一下),或者
# ansible-playbook 01.prepare.yml
# ansible-playbook 02.etcd.yml
# ansible-playbook 03.docker.yml
# ansible-playbook 04.kube-master.yml
# ansible-playbook 05.kube-node.yml
# ansible-playbook 06.network.yml
  • 一步安裝
# ansible-playbook 90.setup.yml
  • 安裝完畢后见芹,需要重新連接或是新開終端才能使用快捷命令(不用全路徑)
  • 查看集群狀態(tài)
[root@localhost ~]# kubectl get node
NAME            STATUS   ROLES    AGE   VERSION
10.25.151.100   Ready    master   16h   v1.13.4
10.25.151.103   Ready    node     16h   v1.13.4
10.25.151.104   Ready    node     16h   v1.13.4
[root@localhost ~]# 
[root@localhost ~]# kubectl get componentstatus
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"}   
[root@localhost ~]# kubectl cluster-info
Kubernetes master is running at https://10.25.151.100:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@localhost ~]# 
[root@localhost ~]# kubectl get pod --all-namespaces
NAMESPACE     NAME                          READY   STATUS    RESTARTS   AGE
kube-system   kube-flannel-ds-amd64-dtsgm   1/1     Running   0          54m
kube-system   kube-flannel-ds-amd64-hfnr6   1/1     Running   0          54m
kube-system   kube-flannel-ds-amd64-pnh4m   1/1     Running   0          54m
[root@localhost ~]# 
[root@localhost ~]# kubectl get svc --all-namespaces
NAMESPACE   NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
default     kubernetes   ClusterIP   10.68.0.1    <none>        443/TCP   16h
[root@localhost ~]# 
  • 查看flannel子網(wǎng)信息(以master為例)
# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
  • 確認(rèn)每個(gè)節(jié)點(diǎn)docker0/flannel的IP地址
100上
docker0 172.17.0.1/16
flannel.1 172.20.0.0/32

103上
docker0 172.17.0.1/16
flannel.1 172.20.1.0/32

104上
docker0 172.17.0.1/16
flannel.1 172.20.2.0/32
  • flannel的使用說明文檔的路徑
/etc/ansible/docs/setup/network-plugin/flannel.md

驗(yàn)證網(wǎng)絡(luò)

節(jié)點(diǎn)上啟動(dòng)pod

  • 隨便哪個(gè)節(jié)點(diǎn)上拉一個(gè)busybox的小鏡像
# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
697743189b6d: Pull complete 
Digest: sha256:061ca9704a714ee3e8b80523ec720c64f6209ad3f97c0ff7cb9ec7d19f15149f
Status: Downloaded newer image for busybox:latest
[root@localhost ~]# 
[root@localhost ~]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
busybox                              latest              d8233ab899d4        5 weeks ago         1.2MB
jmgao1983/flannel                    v0.11.0-amd64       ff281650a721        8 weeks ago         52.6MB
mirrorgooglecontainers/pause-amd64   3.1                 da86e6ba6ca1        15 months ago       742kB
[root@localhost ~]#
  • 創(chuàng)建三個(gè)busybox的pod
# kubectl run test --image=busybox --replicas=3 sleep 30000
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/test created
# 
# kubectl get pod --all-namespaces -o wide|head -n 4
NAMESPACE     NAME                          READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
default       test-568866f478-6z87m         1/1     Running   0          29s   172.20.2.2      10.25.151.104   <none>           <none>
default       test-568866f478-q7fft         1/1     Running   0          29s   172.20.1.2      10.25.151.103   <none>           <none>
default       test-568866f478-sgb5l         1/1     Running   0          29s   172.20.0.2      10.25.151.100   <none>           <none>

可以看到這三個(gè)pod啟動(dòng)在不同的節(jié)點(diǎn)上了

默認(rèn)容器跨節(jié)點(diǎn)通信使用UDP封裝

  • 登錄本地的pod,查看IP和路由
[root@localhost ~]# docker ps | grep busybox
cac2bc7afd61        busybox                                  "sleep 30000"            19 minutes ago      Up 19 minutes                           k8s_test_test-568866f478-sgb5l_default_3c4e60ff-5104-11e9-b02f-005056a921d2_0
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# docker exec -ti  cac2bc7afd61   /bin/sh
/ # 
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
3: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 9e:c3:f5:14:6e:ac brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.2/24 scope global eth0
       valid_lft forever preferred_lft forever
/ # 
/ # ip route
default via 172.20.0.1 dev eth0 
172.20.0.0/24 dev eth0 scope link  src 172.20.0.2 
172.20.0.0/16 via 172.20.0.1 dev eth0
/ # 

網(wǎng)關(guān)172.20.0.1是cni0的IP

  • 從這個(gè)容器去ping其它節(jié)點(diǎn)的容器,是通的
/ # ifconfig | grep 172
          inet addr:172.20.0.2  Bcast:0.0.0.0  Mask:255.255.255.0
/ # 
/ # ping 172.20.2.2 -s 1200
PING 172.20.2.2 (172.20.2.2): 1200 data bytes
1208 bytes from 172.20.2.2: seq=0 ttl=62 time=0.973 ms
1208 bytes from 172.20.2.2: seq=1 ttl=62 time=0.581 ms
  • 跟蹤路由,可以看到是container(master)->cni0(master)->flannel.1(node-2)->container(node-2)
/ # traceroute 172.20.2.2
traceroute to 172.20.2.2 (172.20.2.2), 30 hops max, 46 byte packets
 1  172.20.0.1 (172.20.0.1)  0.017 ms  0.120 ms  0.009 ms
 2  172.20.2.0 (172.20.2.0)  0.970 ms  1.123 ms  0.339 ms
 3  172.20.2.2 (172.20.2.2)  0.411 ms  3.236 ms  2.842 ms
/ # 
  • 在master的物理口抓包,可以看到ICMP報(bào)文被封裝為UDP報(bào)文
# tcpdump -i ens160 -enn 'ip[2:2] > 1200 and  ip[2:2] < 1500'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
02:28:05.870909 00:50:56:a9:21:d2 > 00:50:56:a9:5e:81, ethertype IPv4 (0x0800), length 1292: 10.25.151.100.40238 > 10.25.151.104.8472: OTV, flags [I] (0x08), overlay 0, instance 1
e2:70:a7:b2:ef:fc > 5a:b8:85:c1:65:2f, ethertype IPv4 (0x0800), length 1242: 172.20.0.2 > 172.20.2.2: ICMP echo request, id 6400, seq 888, length 1208
02:28:05.871346 00:50:56:a9:5e:81 > 00:50:56:a9:21:d2, ethertype IPv4 (0x0800), length 1292: 10.25.151.104.34945 > 10.25.151.100.8472: OTV, flags [I] (0x08), overlay 0, instance 1
5a:b8:85:c1:65:2f > e2:70:a7:b2:ef:fc, ethertype IPv4 (0x0800), length 1242: 172.20.2.2 > 172.20.0.2: ICMP echo reply, id 6400, seq 888, length 1208
02:28:06.871170 00:50:56:a9:21:d2 > 00:50:56:a9:5e:81, ethertype IPv4 (0x0800), length 1292: 10.25.151.100.40238 > 10.25.151.104.8472: OTV, flags [I] (0x08), overlay 0, instance 1
  • 抓包后用wireshark解析蠢涝,可以看到原始IP報(bào)文被封裝在UDP玄呛,外層IP是node的IP
flannel_udp.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市和二,隨后出現(xiàn)的幾起案子徘铝,更是在濱河造成了極大的恐慌,老刑警劉巖惯吕,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惕它,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡废登,警方通過查閱死者的電腦和手機(jī)淹魄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堡距,“玉大人甲锡,你說我怎么就攤上這事兆蕉。” “怎么了搔体?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵恨樟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疚俱,道長(zhǎng)劝术,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任呆奕,我火速辦了婚禮养晋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梁钾。我一直安慰自己绳泉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布姆泻。 她就那樣靜靜地躺著零酪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拇勃。 梳的紋絲不亂的頭發(fā)上四苇,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音方咆,去河邊找鬼月腋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓣赂,可吹牛的內(nèi)容都是我干的榆骚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼煌集,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼妓肢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苫纤,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤职恳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后方面,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡色徘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年恭金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褂策。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡横腿,死狀恐怖颓屑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耿焊,我是刑警寧澤揪惦,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站罗侯,受9級(jí)特大地震影響器腋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钩杰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一纫塌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧讲弄,春花似錦措左、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓶摆,卻和暖如春凉逛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赏壹。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工鱼炒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蝌借。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓昔瞧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菩佑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子自晰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容