kubernetes(k8s)搭建實踐
碎碎念
按網上有些文章的意思,之前k8s是有提供安裝的版本,並且有yum源,但是看目前是不需要安裝的,解壓可用
官網地址:ofollow,noindex">https://github.com/kubernetes/kubernetes
可以自己下載原始碼包進行編譯,不過需要go的支援,而且在牆內的話會編譯不過,原因是需要的映象被牆了,所以直接下載release版本即可,地址:https://github.com/kubernetes/kubernetes/releases
筆者使用的是Release v1.2.0-alpha.6 ,這個包已經有496 MB 之大了,而之前的Release v1.1.4 版本才182M,可見更新之快,之多,筆者之前還使用過1.0.1版本,有些介面和引數就已經發生變化了,比如之前kubectl expose的引數是public-ip,而現在改為externalIPs,所以大家實踐時要根據自己的版本
環境說明:
2臺機器,167和168,系統都是centos6.5
167上面會跑etcd,flannel,kube-apiserver,kube-controller-manager,kube-scheduler,自己也充當minion,所以也會跑kube-proxy和kubelet
168上只需要跑etcd,flannel,kube-proxy和kubelet,etcd和flannel是為了打通2臺機器的網路
k8s是建立在docker之上的,所以docker是必須的
環境搭建
打通網路
k8s還需要etcd和Flannel的支援,先下載這2個包,注意2臺機器都需要下載和執行
wget https://github.com/coreos/etcd/releases/download/v2.2.4/etcd-v2.2.4-linux-amd64.tar.gz wget https://github.com/coreos/flannel/releases/download/v0.5.5/flannel-0.5.5-linux-amd64.tar.gz
分別解壓,然後新增到環境變數
cd etcd-v2.2.4-linux-amd64/ cp etcd etcdctl /usr/bin/ cd flannel-0.5.5/ cp flanneld mk-docker-opts.sh /usr/bin
執行
# 167上執行 etcd -name infra0 -initial-advertise-peer-urls http://172.16.48.167:2380 -listen-peer-urls http://172.16.48.167:2380 -listen-client-urls http://172.16.48.167:2379,http://127.0.0.1:2379 -advertise-client-urls http://172.16.48.167:2379 -discovery https://discovery.etcd.io/322a6b06081be6d4e89fd6db941c4add --data-dir /usr/local/kubernete_test/flanneldata >> /usr/local/kubernete_test/logs/etcd.log 2>&1 & # 168上執行 etcd -name infra1 -initial-advertise-peer-urls http://203.130.48.168:2380 -listen-peer-urls http://203.130.48.168:2380 -listen-client-urls http://203.130.48.168:2379,http://127.0.0.1:2379 -advertise-client-urls http://203.130.48.168:2379 -discovery https://discovery.etcd.io/322a6b06081be6d4e89fd6db941c4add --data-dir /usr/local/kubernete_test/flanneldata >> /usr/local/kubernete_test/logs/etcd.log 2>&1 &注意中間的-discovery引數,這是個url地址,我們可以通過訪問 https://discovery.etcd.io/new?size=2
來獲得,size表示minion的數目,我們這裡是2,2臺機器要用同一個url地址,如果訪問這個地址,會發現返回一坨json字串,這個伺服器我們也是可以自己搭建的
這樣就啟動成功了,然後我們可以在任意一臺機器上執行
etcdctl ls etcdctl cluster-health
來確認已經成功啟動,如果有錯可以檢視日誌檔案
tail -n 1000 -f /usr/local/kubernete_test/logs/etcd.log
然後在任一臺機器上執行
etcdctl set /coreos.com/network/config '{ "Network": "172.17.0.0/16" }'
執行
[root@w ~]# etcdctl ls /coreos.com/network/subnets /coreos.com/network/subnets/172.17.4.0-24 /coreos.com/network/subnets/172.17.13.0-24 [root@w ~]# etcdctl get /coreos.com/network/subnets/172.17.4.0-24 {"PublicIP":"203.130.48.168"} [root@w ~]# etcdctl get /coreos.com/network/subnets/172.17.13.0-24 {"PublicIP":"203.130.48.167"}
可以看到167上的網段為172.17.4.13/24
168上的為172.17.14.0/24,我們後面建立的docker容器的IP就分別在這2個網段中
然後2臺機器上分別執行
flanneld >> /usr/local/kubernete_test/logs/flanneld.log 2>&1 &
在每個機器上執行:
mk-docker-opts.sh -i source /run/flannel/subnet.env rm /var/run/docker.pid ifconfig docker0 ${FLANNEL_SUBNET}
然後重啟docker
service docker restart
這樣2臺機器上的容器的網路就打通了,後續可以看到效果
安裝和啟動k8s
wget https://github.com/kubernetes/kubernetes/releases/download/v1.2.0-alpha.6/kubernetes.tar.gz
然後各種解壓
tar zxvf kubernetes.tar.gz cd kubernetes/server tar zxvf kubernetes-server-linux-amd64.tar.gz # 這個是我們需要執行命令的包 cd kubernetes/server/bin/
複製命令到環境變數中,這裡我只複製了kubectl
cp kubectl /usr/bin/
在167上執行
./kube-apiserver --address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range='172.16.48.167/24' --log_dir=/usr/local/kubernete_test/logs/kube --kubelet_port=10250 --v=0 --logtostderr=false --etcd_servers=http://172.16.48.167:2379 --allow_privileged=false >> /usr/local/kubernete_test/logs/kube-apiserver.log 2>&1 & ./kube-controller-manager --v=0 --logtostderr=false --log_dir=/usr/local/kubernete_test/logs/kube --master=172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-controller-manager 2>&1 & ./kube-scheduler --master='172.16.48.167:8080' --v=0 --log_dir=/usr/local/kubernete_test/logs/kube >> /usr/local/kubernete_test/logs/kube-scheduler.log 2>&1 &
這樣就把master跑起來了,
[root@w ~]# kubectl get componentstatuses NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health": "true"} etcd-1 Healthy {"health": "true"}
我們可以看到都很健康的在執行
然後我們就闊以愉快的在2臺機器上跑minion需要的程式了(注意167同時也是minion)
# 167 ./kube-proxy --logtostderr=false --v=0 --master=http://172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-proxy.log 2>&1 & ./kubelet --logtostderr=false --v=0 --allow-privileged=false --log_dir=/usr/local/kubernete_test/logs/kube --address=0.0.0.0 --port=10250 --hostname_override=172.16.48.167 --api_servers=http://172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-kubelet.log 2>&1 & # 168 ./kube-proxy --logtostderr=false --v=0 --master=http://172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-proxy.log 2>&1 & ./kubelet --logtostderr=false --v=0 --allow-privileged=false --log_dir=/usr/local/kubernete_test/logs/kube --address=0.0.0.0 --port=10250 --hostname_override=172.16.48.97 --api_servers=http://172.16.48.167:8080 >> /usr/local/kubernete_test/logs/kube-kubelet.log 2>&1 &
來確認啟動成功
[root@w ~]# kubectl get nodes NAME LABELS STATUS AGE 172.16.48.167 kubernetes.io/hostname=172.16.48.167 Ready 1d 172.16.48.168 kubernetes.io/hostname=172.16.48.168 Ready 18h
2個minion都是Ready
提交命令
k8s支援2種方式,一種是直接通過命令引數的方式,另一種是通過配置檔案的方式,配置檔案的話支援json和yaml,下面只講通過命令引數的方式
建立rc和pod
kubectl run nginx --image=nginx --port=80 --replicas=5
這樣就建立了一個rc和5個pod
通過以下命令可以檢視
kubectl get rc,pods
如果我們手工把建立的pod刪掉,k8s會自動重新啟動一個,始終確保pod的數目為5
跨機器間的通訊
我們分別在167和168上用docker ps來檢視,會發現2臺機器上分別跑了一下nginx的容器,我們在2臺機器上隨意找一個容器進入,使用ip a來檢視IP地址,會發現167上為172.17.13.0/24中,168為172.17.4.0/24中,我們分別ping對方的IP會發現是可以ping通的,說明網路已經通了,如果宿主機可以連上外網的話,在容器中也是可以訪問外網的
如果我們不通過k8來啟動容器,而是直接通過docker來啟動容器,會發現啟動的容器IP端也是在我們上述2個IP段之內的,並且和k8啟動的容器的網路是互通的
當然IP端隨機分配並且是內網的IP會給我們造成一些困擾
比如我們一般會這樣做:通過docker啟動容器,然後通過pipework來給其分配固定IP地址,既可以是內網IP也可以是外網IP,辣麼,這樣的話k8s啟動的容器會和他們想通麼
答案是通了一半,即通過k8s啟動的容器是可以訪問pipework設定的容器的內網IP和外網IP,但是反過來不行,pipework設定的容器是不能訪問k8s啟動的容器的,雖然是這樣,但是不影響我們一般的需求,因為我們一般通過k8s啟動的容器是web應用,通過pipework設定固定IP的是資料庫之類,剛好可以滿足從web應用訪問資料庫的需求
暴露service
kubectl expose rc nginx --port=80 --container-port=9090 --external-ip=x.x.x.168
port引數是容器的埠,因為nginx使用的80,所以這裡必須是80
container-port和target-port是一個意思,指的是宿主機轉發的埠,可以隨意指定一個,也可以不指定
external-ip指的是對外暴露的ip地址,一般用公網IP地址,執行那個命令過後,我們就可以在公網上訪問了,但是這裡有個問題就是這個IP地址必須是安裝了k8s的機器的IP,如果你隨便用一個IP是不能訪問的,這裡也給應用上造成了不便
檢視service
kubectl get svc
可以看到CLUSTER_IP和EXTERNAL_IP
後續的問題
如果用k8s做負載均衡的話,效率會怎樣?怎麼保持session?
由於現在k8s還不是很穩定,可能還不是很適合上生產環境
本文轉移開源中國-kubernetes(k8s)搭建實踐