最近我司的同事都在分享k8s,之前没有玩过,所以来个教程记录下k8s的安装与上手。
本教程是在mac上完成的,其他环境应该大差不差。
安装Kubernetes
首先,mac需要先安装个docker,然后打开docker的设置,然后选择开启kubernetes
等docker客户端转完成后,docker上会显示kubernates正在运行说明安装完成。
验证下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密码
由于第一次登录需要密码才可以进入,所以我们需要生成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
)
我们点击上图中蓝色的文字hello-nginx
,会看到刚刚创建的nginx的所有元数据,比如名称、标签、运行时间、Pod状态等等。
此时我们有一个pod运行这个服务,如果想部署多个相同的服务,我们只需要将这个副本数增加多个,比如我们增加到2个。
那么此时我们就有2个pod
当然我们也可以通过命令行来查看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了。