Kubernetes安装上手(一)

发布于 2020-08-20 19:14:29 阅读 26

最近我司的同事都在分享k8s,之前没有玩过,所以来个教程记录下k8s的安装与上手。

本教程是在mac上完成的,其他环境应该大差不差。

安装Kubernetes

首先,mac需要先安装个docker,然后打开docker的设置,然后选择开启kubernetes

20200820191634.jpg

等docker客户端转完成后,docker上会显示kubernates正在运行说明安装完成。

1597922374694.jpg

验证下k8s是否安装完成

$ kubectl get nodes
NAME             STATUS   ROLES    AGE     VERSION
docker-desktop   Ready    master   9m31s   v1.16.6-beta.0

安装Kubernetes Dashboard

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
....
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

如果没有发生错误,那么继续执行

$ kubectl proxy
Starting to serve on 127.0.0.1:8001

然后打开Kubernetes Dashboard http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

生成Dashboard密码

WX20200820-192921@2x.png

由于第一次登录需要密码才可以进入,所以我们需要生成Token。此时需要重新打开一个终端,执行

$ kubectl -n kube-system get secret
...
default-token-bq77k                              kubernetes.io/service-account-token   3      27m
deployment-controller-token-7hhfh                kubernetes.io/service-account-token   3      27m
disruption-controller-token-k42jz                kubernetes.io/service-account-token   3      27m
...

找到deployment-controller-token字样(deployment-controller-token-7hhfh),然后执行

$ kubectl -n kube-system describe secret deployment-controller-token-7hhfh
...
Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6Il9HclRpX04wblR2QzJYdzlCWnBXQUpEZk05NUx1dTlWQmZPSUJYemx2LXMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc......

我们将token后复制到网页的token处,点击登录即可进入。

基础术语

我们需要先来学习下后面可能会涉及到的术语,方便后面使用理解。

Master(主机): 用于控制 Kubernetes 节点,所有任务分配都来自于此。

Node(节点):负责执行请求和所分配任务。由 Kubernetes 主机负责对节点进行控制。

Pod(容器集):K8s集群中运行部署应用或服务的最小单元,它由一个或多个docker容器的组合。同一pod所有容器共享同 IP 地址、IPC等资源。

Deployment(部署):是一个针对如何管理Pod的工具,通过Development我们可以快速地创建多个Pod副本,并且支持滚动热更新,从而实现了应用程序的热更新

Replication controller,rs(复制控制器):用于控制在集群容器集副本数量,保证在同一时间能够运行指定数量的Pod副本,保证Pod总是可用(管理pod)。

Service(服务):是发现后端pod服务 ,是为一组具有相同功能的容器应用提供一个统一的入口地址;(pod创建,删除 ip是会变的,客户端如何访问呢,通过service 对外提供固定ip和端口)

尝试用k8s运行一个Nginx

$ kubectl run hello-nginx --image=nginx --port=80
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.

其中

hello-nginx 会创建一个名字为hello-nginx的deplyments
--image=nginx 会使用nginx这个docker镜像
--port=80 k8s会开放80端口

这行命令我们部署了一个nginx服务(我们在工作量-Deployments中可以看到我们刚刚创建的hello-nginx

WX20200820-193718@2x.png

我们点击上图中蓝色的文字hello-nginx,会看到刚刚创建的nginx的所有元数据,比如名称、标签、运行时间、Pod状态等等。

20200820210645.jpg

此时我们有一个pod运行这个服务,如果想部署多个相同的服务,我们只需要将这个副本数增加多个,比如我们增加到2个。

2391F7F3-82D1-4C63-B85A-64CC12C290DF.png

那么此时我们就有2个pod

20200820212217.jpg

当然我们也可以通过命令行来查看pod信息,首先获取pod信息

$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
hello-nginx-c56599c4d-fkgzr    1/1     Running   0          153m
hello-nginx-c56599c4d-tngmd    1/1     Running   0          16m

然后选择一个pod

$ kubectl describe pod hello-nginx-c56599c4d-fkgzr
Name:         hello-nginx-c56599c4d-fkgzr
Namespace:    default
Priority:     0
Node:         docker-desktop/192.168.65.3
Start Time:   Thu, 20 Aug 2020 19:03:58 +0800
Labels:       pod-template-hash=c56599c4d
              run=hello-nginx
Annotations:  <none>
Status:       Running
IP:           10.1.0.11
IPs:
  IP:           10.1.0.11
Controlled By:  ReplicaSet/hello-nginx-c56599c4d
Containers:
  hello-nginx:
    Container ID:   docker://78d4e2e774c97798d7c689bec3b7d27ea3f3b446cdde474ed95f2024e6d4caa4
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:b0ad43f7ee5edbc0effbc14645ae7055e21bc1973aee5150745632a24a752661
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Thu, 20 Aug 2020 19:04:30 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-s82s8 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-s82s8:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-s82s8
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

将nginx暴露服务,让外部访问

$ kubectl expose deployment hello-nginx --type=NodePort --name=hello-nginx-service
service "hello-nginx-service" exposed

执行完成后,再执行

$ kubectl get service
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
example-service       NodePort    10.99.227.175   <none>        8080:31990/TCP   3h17m
hello-nginx-service   NodePort    10.103.58.135   <none>        80:32082/TCP     153m

此时我们可以再浏览器中打开http://127.0.0.1:32082/来访问nginx了。