**

Jackey的K8S之路

**

0、docker相关概念

​ docker的存在是为了更方便快捷地去部署一个应用,两个重要的概念,镜像和容器。镜像它的作用有点像maven工程的pom文件,只要写好了pom文件,IDEA就会自动去下载这些需要的依赖,镜像会把所有需要用到的依赖打包,与pom不同的是,镜像还包含着应用程序。镜像和容器的关系,相似于类和对象的关系,镜像是类,容器是镜像的一个实例化。一个镜像可以实例化出好多容器。

1、docker常用指令

# 从docker hub拉取镜像
docker pull <image-name>:<tag>

# 查看镜像列表
docker images

# 查看正在运行的容器
docker ps

# 查看所有的容器,包括已经停止的容器
docker ps -a

# 查看容器的详细信息
docker inspect <容器名称|容器ID>

# 运行容器,命令语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 常用的命令选项如下(需要注意的是,选项参数要放在 run 和 镜像名称 中间):
# -d: 后台运行容器,并返回容器ID;
# -i: 以交互模式运行容器,通常与 -t 同时使用;
# -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
# -P: 随机端口映射,容器内部端口随机映射到主机的端口
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# --name="nginx-lb": 为容器指定一个名称;
# -e username="ritchie": 设置环境变量;
# --volume , -v: 绑定一个卷
# 
# 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
docker run --name mynginx -d nginx:latest
# 使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。
docker run -P -d nginx:latest
# 使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。
docker run -p 80:80 -v /data:/data -d nginx:latest
# 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。
docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
# 使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
docker run -it nginx:latest /bin/bash

# 查看容器日志
docker logs <容器名称|容器ID>

# 停止容器
docker stop <容器名称|容器ID>

# 删除容器,并且只能删除已经停止的容器
docker rm <容器名称|容器ID>
# 清除全部已停止的容器
docker container prune
# 命令规律总结
# docker run:
docker run +各种参数(-i -t -d -p -P -v --name) + 镜像名 + 创建容器后的操作

# -p参数
-p + 主机ip:port:容器port
eg.  docker run -p 127.0.0.1:80:8080/tcp ubantu bash

# -v参数
-v + 本地路径 : 容器路径
eg.  docker run -v /host/data:/volume/data ubantu bash

2、k8s相关概念

  • ​ k8s是一个容器编排工具,重点在编排,它的存在是符合客观发展规律的,当docker使用越来越广泛,服务器中的容器也就会越来越多,就面临着管理这些容器的任务,比如我们要部署一个web项目,需要先启动Mysql,再启动tomcat,最后是Ngix,如何去控制容器运行的顺序,k8s应运而生。

  • ​ k8s中的一个重要概念是pod。pod是k8s的最小单元,每个pod中含有一个或多个container。它就像小组长,寝室长,举一个生活中的例子,本科的时候当班长,老师要统计所有学生的信息,我挨个去问太麻烦了,就交给寝室长去做,我只负责对接寝室长。寝室长就是pod,寝室成员就像是多个container。

  • ​ k8s把container进一步抽象成pod。通过pod来管理几个相关联的container。

  • ​ k8s也是主从架构

  • ​ k8s类似yarn,都是为了管理,管理对象不同,yarn管理的是进程,k8s管理的是容器。

  • ​ pod只能通过k8s的集群内部ip地址访问,要想让它公开,需要把它暴露为service

3、用minikube运行一个应用

#使用 kubectl create 命令创建管理 Pod 的 Deployment。该 Pod 根据提供的 Docker 镜像运行 Container。

$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

#查看 Deployment:

$ kubectl get deployments
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   1/1     1            1           13s

#查看 Pod:

$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
hello-node-7567d9fdc9-brx28   1/1     Running   0          85s

# 查看集群事件:

$ kubectl get events
LAST SEEN   TYPE     REASON                    OBJECT                             MESSAGE
106s        Normal   Scheduled                 pod/hello-node-7567d9fdc9-brx28    Successfully assigned default/hello-node-7567d9fdc9-brx28 to minikube
104s        Normal   Pulling                   pod/hello-node-7567d9fdc9-brx28    Pulling image "k8s.gcr.io/echoserver:1.4"
104s        Normal   Pulled                    pod/hello-node-7567d9fdc9-brx28    Successfully pulled image "k8s.gcr.io/echoserver:1.4" in 552.292333ms
104s        Normal   Created                   pod/hello-node-7567d9fdc9-brx28    Created container echoserver
103s        Normal   Started                   pod/hello-node-7567d9fdc9-brx28    Started container echoserver
106s        Normal   SuccessfulCreate          replicaset/hello-node-7567d9fdc9   Created pod: hello-node-7567d9fdc9-brx28
106s        Normal   ScalingReplicaSet         deployment/hello-node              Scaled up replica set hello-node-7567d9fdc9 to 1
6m39s       Normal   NodeHasSufficientMemory   node/minikube                      Node minikube status is now: NodeHasSufficientMemory
6m39s       Normal   NodeHasNoDiskPressure     node/minikube                      Node minikube status is now: NodeHasNoDiskPressure
6m39s       Normal   NodeHasSufficientPID      node/minikube                      Node minikube status is now: NodeHasSufficientPID
6m14s       Normal   Starting                  node/minikube                      Starting kubelet.
6m14s       Normal   NodeHasSufficientMemory   node/minikube                      Node minikube status is now: NodeHasSufficientMemory
6m14s       Normal   NodeHasNoDiskPressure     node/minikube                      Node minikube status is now: NodeHasNoDiskPressure
6m14s       Normal   NodeHasSufficientPID      node/minikube                      Node minikube status is now: NodeHasSufficientPID
6m13s       Normal   NodeNotReady              node/minikube                      Node minikube status is now: NodeNotReady
6m13s       Normal   NodeAllocatableEnforced   node/minikube                      Updated Node Allocatable limit across pods
6m6s        Normal   RegisteredNode            node/minikube                      Node minikube event: Registered Node minikube in Controller
6m6s        Normal   NodeReady                 node/minikube                      Node minikube status is now: NodeReady
6m2s        Normal   Starting                  node/minikube                      Starting kube-proxy.

# 查看 kubectl 配置:

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /root/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Wed, 17 Nov 2021 06:30:03 UTC
        provider: minikube.sigs.k8s.io
        version: v1.18.0
      name: cluster_info
    server: https://172.17.0.30:8443
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Wed, 17 Nov 2021 06:30:03 UTC
        provider: minikube.sigs.k8s.io
        version: v1.18.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /root/.minikube/profiles/minikube/client.crt
    client-key: /root/.minikube/profiles/minikube/client.key
    
# 创建service,默认情况下,Pod 只能通过 Kubernetes 集群中的内部 IP 地址访问。 要使得 hello-node 容器可以从 Kubernetes 虚拟网络的外部访问,你必须将 Pod 暴露为 Kubernetes Service。使用 kubectl expose 命令将 Pod 暴露给公网:
$ kubectl expose deployment hello-node --type=LoadBalancer --port=8080
service/hello-node exposed

# 查看你创建的 Service:
$ kubectl get services
NAME         TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
hello-node   LoadBalancer   10.97.152.31   <pending>     8080:30527/TCP   32s
kubernetes   ClusterIP      10.96.0.1      <none>        443/TCP          9m22s

# 使服务生效
$ minikube service hello-node
|-----------|------------|-------------|--------------------------|
| NAMESPACE |    NAME    | TARGET PORT |           URL            |
|-----------|------------|-------------|--------------------------|
| default   | hello-node |        8080 | http://172.17.0.30:30527 |
|-----------|------------|-------------|--------------------------|
* Opening service default/hello-node in default browser...
Minikube Dashboard is not supported via the interactive terminal experience.

Please click the 'Preview Port 30000' link above to access the dashboard.
This will now exit. Please continue with the rest of the tutorial.

X Exiting due to HOST_BROWSER: exit status 1
* 
* If the above advice does not help, please let us know: 
  - https://github.com/kubernetes/minikube/issues/new/choose
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐