kubernetes(k8s)搭建實踐

碎碎念

按網上有些文章的意思,以前k8s是有提供安裝的版本,而且有yum源,可是看目前是不須要安裝的,解壓可用 java

官網地址:https://github.com/kubernetes/kubernetes node

能夠本身下載源碼包進行編譯,不過須要go的支持,並且在牆內的話會編譯不過,緣由是須要的鏡像被牆了,因此直接下載release版本便可,地址:https://github.com/kubernetes/kubernetes/releases linux

筆者使用的是Release v1.2.0-alpha.6,這個包已經有496 MB之大了,而以前的Release v1.1.4版本才182M,可見更新之快,之多,筆者以前還使用過1.0.1版本,有些接口和參數就已經發生變化了,好比以前kubectl expose的參數public-ip,而如今改成externalIPs,因此你們實踐時要根據本身的版本 nginx

環境說明:

2臺機器,167和168,系統都是centos6.5 git

167上面會跑etcd,flannel,kube-apiserver,kube-controller-manager,kube-scheduler,本身也充當minion,因此也會跑kube-proxy和kubelet   github

168上只須要跑etcd,flannel,kube-proxy和kubelet,etcd和flannel是爲了打通2臺機器的網絡 web

k8s是創建在docker之上的,因此docker是必須的 docker

環境搭建

打通網絡

k8s還須要etcd和Flannel的支持,先下載這2個包,注意2臺機器都須要下載和執行 shell

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還不是很穩定,可能還不是很適合上生產環境

相關文章
相關標籤/搜索