隨着愈來愈多的公司使用Kubernetes做爲它們運行應用的最佳平臺,Kubernetes幫助企業標準化了不管是雲端部署仍是內部部署的應用交付方式;做爲研發人員咱們仍是頗有必要去了解其使用方式,瞭解其內部機制,接下來的一段時間準備經過閱讀<Kubernetes in Action>來更多的瞭解Kubernetes。node
由於最先以前安裝使用過docker,後面一段時間都沒有用過,而Docker從17.03開始分爲docker-ce(社區版)和docker-ee(企業版),因此先要刪除本地的舊版本;linux
# 移除掉舊的版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine # 刪除全部舊的數據 sudo rm -rf /var/lib/docker
docker依賴devicemapper存儲類型,邏輯卷管理lvm2;git
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
添加Docker穩定版本的yum軟件源;github
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
使用了阿里雲鏡像docker
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝最新穩定版本的dockershell
sudo yum install -y docker-ce
若是想安裝指定版本的Docker,能夠查看一下版本並安裝json
yum list docker-ce --showduplicates | sort -r
能夠指定版本安裝,版本號能夠忽略:和el7,如 docker-ce-19.03.4windows
sudo yum install docker-ce-<VERSION STRING>
使用命令docker versioncentos
[root@localhost /]# docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea Built: Wed Nov 13 07:25:41 2019 OS/Arch: linux/amd64 Experimental: false
啓動dockerapi
sudo systemctl start docker
驗證是否啓動成功
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
若是沒有啓動成功會顯示Cannot connect to the Docker daemon;
sudo systemctl stop docker
關閉使用stop命令便可;
更新docker
sudo yum update docker-ce
卸載docker
sudo yum remove docker-ce
selinux-policy包與預期下載不匹配
selinux-policy-3.13.1-252.el7_ FAILED http://mirrors.aliyun.com/centos/7.7.1908/updates/x86_64/Packages/selinux-policy-3.13.1-252.el7_7.6.noarch.rpm: [Errno -1] Package does not match intended download. Suggestion: run yum --enablerepo=updates clean metadata
手動下載安裝便可
[root@localhost ~]# docker run busybox echo "Hello world" Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 322973677ef5: Pull complete Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084 Status: Downloaded newer image for busybox:latest Hello world
busybox是一個單一可執行文件,包含多種標準UNIX命令行工具,如:echo、ls 、gzip等;由上面的日誌能夠看出首先在本地找busybox:latest鏡像,找不到會從Docker鏡像中心拉取鏡像,存放本地等待下次使用;
[root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest b534869c81f0 8 days ago 1.22MB
能夠經過docker images查看當前的鏡像列表;
建立一個Node.js應用的docker鏡像,至少須要兩個文件:應用文件,Dockerfile文件;
const http = require('http'); const os = require('os'); console.log("kubia server is starting..."); var handler = function(request,response){ console.log("Received request from " + request.connection.remoteAddress); response.writeHead(200); response.end("You've hit " + os.hostname()+"\n"); }; var www = http.createServer(handler); www.listen(8080);
啓動了一個端口爲8080的http服務器,每一個請求服務器會返回主機名稱;
FROM node:7 ADD app.js /app.js ENTRYPOINT ["node","app.js"]
From行定義了鏡像的起始內容,使用的是node鏡像的tag7版本;第二行中把app.js文件從本地文件夾添加到鏡像的根目錄;最後一行定義了當鏡像被運行時須要被執行的命令;
[root@localhost docker]# docker build -t kubia . Sending build context to Docker daemon 3.072kB Step 1/3 : FROM node:7 7: Pulling from library/node ad74af05f5a2: Pull complete 2b032b8bbe8b: Pull complete a9a5b35f6ead: Pull complete 3245b5a1c52c: Pull complete afa075743392: Pull complete 9fb9f21641cd: Pull complete 3f40ad2666bc: Pull complete 49c0ed396b49: Pull complete Digest: sha256:af5c2c6ac8bc3fa372ac031ef60c45a285eeba7bce9ee9ed66dad3a01e29ab8d Status: Downloaded newer image for node:7 ---> d9aed20b68a4 Step 2/3 : ADD app.js /app.js ---> 28e5c631a15f Step 3/3 : ENTRYPOINT ["node","app.js"] ---> Running in 63035bc6504d Removing intermediate container 63035bc6504d ---> bfb268fa87e0 Successfully built bfb268fa87e0 Successfully tagged kubia:latest
使用docker build構建鏡像,Docker 須要基於當前目錄(注意命令結尾的點)構建一個叫kubia的鏡像,Docker會在目錄中尋找Dockerfile,而後基於其中的指令構建鏡像。
[root@localhost docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE kubia latest bfb268fa87e0 12 minutes ago 660MB node 7 d9aed20b68a4 2 years ago 660MB
構建完以後能夠查看當前鏡像,除了咱們構建的kubia鏡像,還有node鏡像,由於docker鏡像不是一個大的二進制塊, 而是由多層組成的;
[root@localhost docker]# docker run --name kubia-container -p 8080:8080 -d kubia 2f7a60412ae6f067226343550ad01cbcb1de7808ed2a0cdeed0b62be5c90f556
Docker基於kubia鏡像建立一個叫kubia-container的新容器,本機上的8080端口會被映射到容器內的8080端口,而且在後臺運行;本機和其餘內網機器均可以訪問8080端口:
[root@localhost docker]# curl localhost:8080 You've hit 2f7a60412ae6
瀏覽器訪問8080端口:
容器啓動成功後,列出運行中的容器:
[root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f7a60412ae6 kubia "node app.js" 11 minutes ago Up 11 minutes 0.0.0.0:8080->8080/tcp kubia-container
[root@localhost docker]# docker exec -it kubia-container bash root@2f7a60412ae6:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 1.6 682524 16232 ? Ssl 10:55 0:00 node app.js root 11 0.2 0.1 20240 1912 pts/0 Ss 11:13 0:00 bash root 16 0.0 0.1 17496 1136 pts/0 R+ 11:13 0:00 ps aux
在已有的kubia-container容器內部運行bash;-i確保標準輸入流保持開放,須要在shell 中輸入命令;-t分配一個僞終端(TTY);使用命令ps aux查看進程,能夠看到其中就有app.js進程;
[root@localhost docker]# docker stop kubia-container kubia-container [root@localhost docker]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f7a60412ae6 kubia "node app.js" 29 minutes ago Exited (137) 6 minutes ago kubia-container
使用stop命令中止容器以後,ps命令就查不到正在運行的容器;ps -a列出全部容器(包括正在運行和不在運行的);
[root@localhost docker]# docker rm kubia-container kubia-container [root@localhost docker]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
使用rm命令刪除容器,這樣ps -a也查不到容器了;
[root@localhost docker]# docker tag kubia ksfzhaohui/kubia [root@localhost docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ksfzhaohui/kubia latest bfb268fa87e0 2 hours ago 660MB kubia latest bfb268fa87e0 2 hours ago 660MB
給同一個鏡像建立一個額外的標籤,能夠發現IMAGE ID都是同一個;這裏的ksfzhaohui用本身的Docker Hub ID代替;
推送以前是須要登陸docker hub的,使用login命令:
[root@localhost docker]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: ksfzhaohui Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
登陸成功以後就能夠,推送鏡像到hub了,使用push命令:
[root@localhost docker]# docker push ksfzhaohui/kubia The push refers to repository [docker.io/ksfzhaohui/kubia] d6851d29939a: Pushed ab90d83fa34a: Mounted from library/node 8ee318e54723: Mounted from library/node e6695624484e: Mounted from library/node da59b99bbd3b: Mounted from library/node 5616a6292c16: Mounted from library/node f3ed6cb59ab0: Mounted from library/node 654f45ecb7e3: Mounted from library/node 2c40c66f7667: Mounted from library/node latest: digest: sha256:6ef8bb39b65fbc08137f8bd58531195289f8dcfc1c1a6bb482c993c5667cc8f3 size: 2213
登陸docker hub查看是否已經上傳成功
安裝Kubemetes集羣的方法有許多,Kubemetes能夠在本地的開發機器、本身組織的機器集羣或是虛擬機提供商(Google Compute Engine、Amazon EC二、Microsoft Azure 等)上運行,或者使用託管的Kubemetes集羣,如Google Kubemetes Engine;最簡單的方式是用Minikube 運行一個本地單節點Kubernetes集羣;
Minikube是一個須要下載並放到路徑中的二進制文件;它適用於osx 、Linux和Windows系統;更多詳細Getting Started,這裏在windows系統下安裝,下載minikube installer便可,雙擊安裝到D:\Program Files\Kubernetes\Minikube目錄下;
D:\Program Files\Kubernetes\Minikube>minikube start --vm-driver=virtualbox --iso -url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.6. 0.iso --image-repository registry.aliyuncs.com/google_containers --image-mirror- country cn
--iso-url:利用阿里雲的鏡像地址下載相應的.iso文件;
--image-repository:默認值是k8s.gcr.io,指向阿里雲的鏡像地址:registry.aliyuncs.com/google_containers
--image-mirror-country:指定容器鏡像倉庫;
下載windows版本kubectl,無需安裝直接在cmd中使用命令便可,如查看集羣是否正常工做:
D:\k8s>kubectl cluster-info Kubernetes master is running at https://192.168.99.107:8443 KubeDNS is running at https://192.168.99.107:8443/api/v1/namespaces/kube-system/ services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
使用命令minikube dashboard:
D:\Program Files\Kubernetes\Minikube>minikube dashboard * Verifying dashboard health ... * Launching proxy ... * Verifying proxy health ... * Opening http://127.0.0.1:59371/api/v1/namespaces/kubernetes-dashboard/services /http:kubernetes-dashboard:/proxy/ in your default browser...
會自動跳轉到瀏覽器中,控制檯以下所示:
在Kubernetes上部署上面推送到Docker Hub的kubia鏡像
D:\k8s>kubectl run kubia --image=ksfzhaohui/kubia --port=8080 --generator=run/v1 kubectl run --generator=run/v1 is DEPRECATED and will be removed in a future ver sion. Use kubectl run --generator=run-pod/v1 or kubectl create instead. replicationcontroller/kubia created
能夠經過命令或者在控制檯查看當前部署的狀況:
C:\Users\hui.zhao.cfs>kubectl get pods NAME READY STATUS RESTARTS AGE kubia-797mx 0/1 ImagePullBackOff 0 16m
一個pod是一組緊密相關的容器,它們老是一塊兒運行在同一個工做節點上,以及同一個Linux 命名空間中。每一個pod就像一個獨立的邏輯機器,擁有本身的IP 、主機名、進程等,運行一個獨立的應用程序;
以上的ready爲0/1表示爲掛起狀態,由於須要下載鏡像,啓動容器等一系列操做;
C:\Users\hui.zhao.cfs>kubectl get pods NAME READY STATUS RESTARTS AGE kubia-dms8n 1/1 Running 0 18m
ready爲1/1表示已經部署就緒了;
每一個pod都有本身的IP 地址,可是這個地址是集羣內部的,不能從集羣外部訪問。要讓pod可以從外部訪問,須要經過服務對象公開它,要建立一個特殊的LoadBalancer類型的服務;
C:\Users\hui.zhao.cfs>kubectl expose rc kubia --type=NodePort service/kubia exposed
列出全部服務
C:\Users\hui.zhao.cfs>kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h13m kubia NodePort 10.96.174.172 <none> 8080:30265/TCP 2m12s
查看kubia service的url
D:\Program Files\Kubernetes\Minikube>minikube service kubia --url http://192.168.99.108:30265
能夠拿着提供的對外ip在瀏覽器中進行訪問
使用Kubemetes的一個主要好處是能夠簡單地擴展部署,把運行實例的數量增長到三個;
C:\Users\hui.zhao.cfs>kubectl get replicationcontrollers NAME DESIRED CURRENT READY AGE kubia 1 1 1 172m
當前的副本數爲1,而後設置副本數爲3
C:\Users\hui.zhao.cfs>kubectl scale rc kubia --replicas=3 replicationcontroller/kubia scaled C:\Users\hui.zhao.cfs>kubectl get replicationcontrollers NAME DESIRED CURRENT READY AGE kubia 3 3 1 174m
從控制檯看也能夠看到有三個副本:
本文從Docker安裝和使用開始,到配置Kubernetes集羣,最後介紹瞭如何在Kubernetes上運行第一個應用;經過實戰操做的方式對Kubernetes有個簡單的認識。
Kubernetes in Action