Kubernetes入門篇

前言

隨着愈來愈多的公司使用Kubernetes做爲它們運行應用的最佳平臺,Kubernetes幫助企業標準化了不管是雲端部署仍是內部部署的應用交付方式;做爲研發人員咱們仍是頗有必要去了解其使用方式,瞭解其內部機制,接下來的一段時間準備經過閱讀<Kubernetes in Action>來更多的瞭解Kubernetes。node

Docker安裝

1.刪除舊版本

由於最先以前安裝使用過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

2.安裝依賴

docker依賴devicemapper存儲類型,邏輯卷管理lvm2;git

sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

3.添加yum軟件源

添加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

4.安裝docker

安裝最新穩定版本的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>

5.查看版本

使用命令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

6.啓動關閉docker

啓動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命令便可;

7.更新和卸載

更新docker

sudo yum update docker-ce

卸載docker

sudo yum remove docker-ce

8.安裝遇到的問題

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

手動下載安裝便可

Docker使用

1.運行hello world容器

[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查看當前的鏡像列表;

2.建立Node.js鏡像

建立一個Node.js應用的docker鏡像,至少須要兩個文件:應用文件,Dockerfile文件;

2.1 應用文件app.js

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服務器,每一個請求服務器會返回主機名稱;

2.2 Dockerfile文件

FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node","app.js"]

From行定義了鏡像的起始內容,使用的是node鏡像的tag7版本;第二行中把app.js文件從本地文件夾添加到鏡像的根目錄;最後一行定義了當鏡像被運行時須要被執行的命令;

2.3構建鏡像

[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鏡像不是一個大的二進制塊, 而是由多層組成的;

3.運行容器鏡像

[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端口:
image.png

容器啓動成功後,列出運行中的容器:

[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

4.探索運行容器的內部

[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進程;

5.中止和刪除容器

[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也查不到容器了;

6.向鏡像倉庫推送鏡像

6.1 使用附加標籤標註鏡像

[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代替;

6.2 向Docker Hub推送鏡像

推送以前是須要登陸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查看是否已經上傳成功
image.png

配置Kubernetes集羣

安裝Kubemetes集羣的方法有許多,Kubemetes能夠在本地的開發機器、本身組織的機器集羣或是虛擬機提供商(Google Compute Engine、Amazon EC二、Microsoft Azure 等)上運行,或者使用託管的Kubemetes集羣,如Google Kubemetes Engine;最簡單的方式是用Minikube 運行一個本地單節點Kubernetes集羣;

1.安裝minikube

Minikube是一個須要下載並放到路徑中的二進制文件;它適用於osx 、Linux和Windows系統;更多詳細Getting Started,這裏在windows系統下安裝,下載minikube installer便可,雙擊安裝到D:\Program Files\Kubernetes\Minikube目錄下;

2.啓動Kubernetes集羣

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:指定容器鏡像倉庫;

3.安裝kubectl

下載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'.

4.Kubernetes控制檯

使用命令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...

會自動跳轉到瀏覽器中,控制檯以下所示:
image.png

在Kubernetes上運行第一個應用

1.部署kubia鏡像

在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表示已經部署就緒了;

2.訪問kubia應用

每一個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在瀏覽器中進行訪問
image.png

3.水平伸縮應用

使用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

從控制檯看也能夠看到有三個副本:
image.png

總結

本文從Docker安裝和使用開始,到配置Kubernetes集羣,最後介紹瞭如何在Kubernetes上運行第一個應用;經過實戰操做的方式對Kubernetes有個簡單的認識。

參考

Kubernetes in Action

博客地址

Github

相關文章
相關標籤/搜索