Docker从入门到掉坑(五):继续挖一挖 k8s

在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作及k8s上手避坑,在接下来的这篇文章开始,我们将继续对k8s模块的学习

pod是啥

在k8s里面,有很多新的技术概念,其中有一个东西被称之为pod。pod是k8s集群里面运行和部署的最小单元,它的设计理念是,一个pod可以承载多个容器,并且共享网络地址和文件系统,内部的容器通过进程间的通信相互访问。

官方图片附上:

复制控制器(Replication Controller,RC)

通常我们在k8s集群里面会有成千上百个pod,那么对于pod的管理也是需要有一定的机制,k8s内部有个叫做RC(Replication Controller) 的复制控制器。

RC主要的是监控pod节点的数目,当我们在启动pod的时候希望有多个pod副本,可以使用RC来控制启动的数目,如果期间有部分pod挂掉了,RC会自动进行重启pod。

k8s里面常见的pod操作场景

1.在实操的过程中,如果你遇到了下边的这种情况,某个pod一直起不来

[[email protected] ~]# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
mysql-rc-p8blq                      0/1     ErrImagePull        0          16h
nginx                               1/1     Running             0          29h
nginx-deployment-54f57cf6bf-f9p92   0/1     ContainerCreating   0          77s
nginx-deployment-54f57cf6bf-mqq7x   0/1     ImagePullBackOff    0          18m
nginx-deployment-9f46bb5-kwxwh      0/1     ImagePullBackOff    0          13m
tomcat-565cd88dc7-qlqtk             1/1     Running             0          2d3h

这个时候pod可能会出现启动失败的情况,那么这个时候该如何去终止对应的pod呢?

通过以下的命令来对容器进行删除即可:

[[email protected] k8s]# kubectl delete -f ./mysql-rc.yaml
replicationcontroller "mysql-rc" deleted
[[email protected] k8s]# kubectl delete -f ./mysql-svc.yaml
service "mysql-svc" deleted
[[email protected] k8s]# kubectl delete -f ./nginx-deployment.yaml
deployment.apps "nginx-deployment" deleted
[[email protected] k8s]# kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
nginx                     1/1     Running   0          29h
tomcat-565cd88dc7-qlqtk   1/1     Running   0          2d3h

2.如何运行单容器的pods

kubectl run example --image=nginx

3.查看某个pod详细信息

[[email protected] k8s]# kubectl get pod nginx -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          29h   172.17.0.7   minikube   <none>           <none>

4.查看某pod里面的详情描述内容

[[email protected] k8s]# kubectl describe pod nginx
Name:         nginx
Namespace:    default
Priority:     0
Node:         minikube/10.1.10.51
Start Time:   Mon, 02 Dec 2019 09:49:28 +0800
Labels:       app=pod-example
Annotations:  <none>
Status:       Running
IP:           172.17.0.7
IPs:
  IP:  172.17.0.7
Containers:
  web:
    Container ID:   docker://53d066b49233d17724b8fd0d5a4d6a963f33e6ea4e0805beb7745ee267683ed8
    Image:          nginx
    Image ID:       docker-pullable://[email protected]:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 02 Dec 2019 09:51:22 +0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-7mltd (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-7mltd:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-7mltd
    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>

5.替换pod对应的配置规则文件

kubectl replace --force -f 规则文件

6.假设说你在操控pod节点的过程中不小心写错了镜像的地址,导致pod启动失败,这个时候我们可以删除机器上边的某个pod节点,例如:

删除一个name为nginx的pod节点:

[[email protected] k8s]# kubectl delete pod nginx
pod "nginx" deleted

7.删除某台机器上边deployment信息:

[[email protected] k8s]# kubectl delete deployment tomcat
deployment.apps "tomcat" deleted

8.多容器pod启动的步骤

我们启动多个容器的pod时候,最好使用create命令来操作,并且在创建的时候最好是使用yaml(或者json格式)这种文件来对容器的启动进行管理:

 kubectl create -f FILE

通常启动pod的yaml文件的格式基本如下:

apiVersion: v1
kind: Pod
metadata:
  name: rss-site
  labels:
    app: web
spec:
  containers:
    - name: 容器1
      image: 镜像名1
      ports:
        - containerPort: 80
    - name: 容器1
      image: 镜像名2
      ports:
        - containerPort: 88
spec:

如果启动过程中需要有多个docker容器,那么就写多个name,image,ports这类配置即可。

在k8s的pod启动过程中,如果出现多次发现镜像拉取失败的情况,通常是因为镜像源地址出错,这时候需要重置docker镜像源地址:

# vi /etc/docker/daemon.json
{
    "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service

设置好这份json文件之后,我们进行restart操作即可。

编写好了yaml文件之后,再次使用 kubectl create -f FILE命令即可。

最后通过kubectl get pod指令来验证pod的状态即可。

同理,如果我们需要用pod装载java程序的话,例如说是springboot应用,只需要将springboot应用打包成docker镜像,然后在yml配置里面引入就好了。

9.查看pod内部节点的日志信息

kubectl logs <pod_name>
kubectl logs -f <pod_name> #类似tail -f的方式查看(tail -f 实时查看日志文件 tail -f 日志文件log)

前边我们主要都是讲解一些基于容器化技术的实战,操作了这么多容器化的api命令,其背后架构的设计思路却又是怎样的呢?

10.kubernetes的基本架构

用一句简单的话语来介绍,kubernetes就是一个容器的集群管理系统,通过kubernetes可以实现对于容器集群化的自动化部署,自动化扩容,维护等作用。

kubernetes集群是由一个master来负责对各个节点进行管理的,其中被管理的各个node节点可能会是一些虚拟机或者小型机器。在每个node节点上都会运作有各种各样的pod,而pod通常会是各种各样的docker容器。

基本的架构图如下所示:

Master模块

kubectl主要的作用是对kubernetes发送命令,通过使用apiserver来调用kubernets对内部的各个node节点进行部署和控制。

ApiServer的主要工作就是对各个node节点进行增删改查,提到对节点数据的操作,我们不得不得说明一下etcd。etcd主要是存储一些节点的数据信息,并且每次kubectl发送过来的指令都会被apiserver先存储到etcd中。

Controller manager 的作用主要是监控各个容器的情况。Controller manager会通过监听Api Server里面的提供的一个List Watch接口来监控各个集群资源的数据,从而调整资源的状态。

举个栗子来讲:

在成百上千的微服务系统中,假设说某个节点出现了crash,那么这个时候Controller manager就会自动地进行节点的修复,故障转移,这样就能很好地减轻了运维人员的压力。

Scheduler 主要是一个调度的作用,将容器部署到指定的机器上边,然后将pod和node资源进行映射,当节点数目变多了之后,scheduler会自动进行资源的分配。所以说白了,Scheduler是老大,它来决定每个pod要放置在哪个node上边,并且命令kubelet进行容器的部署。

Node模块

Node是k8s的工作节点,Node 一般是一个虚拟机或者物理机,每个 node 上都运行三个服务,分别是Container runtime,kubelet,kube-proxy三类。

kubelet 主要是负责接收master的命令,并且执行,同时还要维护容器的生命周期。
kube-proxy 主要的作用就是负责负载均衡,处理流量的转发问题。

Container runtime 是负责镜像管理以及pod和容器的真正运行。

从K8s的系统架构、技术概念和设计理念,我们可以看到K8s系统最核心的两个设计理念:一个是容错性,一个是易扩展性。容错性实际是保证K8s系统稳定性和安全性的基础,易扩展性是保证K8s对变更友好,可以快速迭代增加新功能的基础。

原文地址:https://www.cnblogs.com/javazhiyin/p/12082992.html

时间: 2024-07-31 17:44:03

Docker从入门到掉坑(五):继续挖一挖 k8s的相关文章

Docker 从入门到掉坑

简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有着很多的优点,关于它的优点,可以总结为以下几项: 安装docker 从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE. Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用. 首先我们需要移除旧的docker版本:

Docker 从入门到弃坑

清理低版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine sudo yum install -y yum-utils device-mapper-persistent-data lvm2 安装docker sudo yum install docker-ce su

python从入门到掉坑

python   从起步到跑路 第一部分 第一章起步 1.里面讲了怎么安装python 以及怎么使用python还有他的辅助使用软件geany(sublime)以及运行第一个程序print("Hello python word!") 2.以及在windows终端运行python c:\> cd Desktop\python_work c:\Desktop\python_work> dir hello_world.py c:\Desktop\python_work>py

我在部署docker的时候遇到的坑

以下总结一些我个人在搭建测试环境之中使用docker的坑 1.docker端口的坑 docker 容器在创建的时候,可以通过-p 指令来映射端口,使外部的网络能通过该端口访问容器的服务. 但是如果容器的端口已经设定,且容器已经运行起来的时候,是无法映射或者更改新的端口的. 所以这个坑要有所注意,不然又得从新commit镜像重新run,浪费时间. 2.docker容器IP地址的坑 docker的镜像一般都是原版centos等慢慢扩展的.网络这块是dhcp模式的,所以每次在重启容器的时候,docke

Hadoop入门进阶步步高(五)-搭建Hadoop集群

五.搭建Hadoop集群 上面的步骤,确认了单机可以执行Hadoop的伪分布执行,真正的分布式执行无非也就是多几台slave机器而已,配置方面的有一点点区别,配置起来就非常简单了. 1.准备三台服务器 192.168.56.101 192.168.56.102 192.168.56.103 在每台机器的/etc/hosts中都将ip及hostname给映射上: 192.168.56.101  nginx1 192.168.56.102  nginx2 192.168.56.103  nginx3

Docker 使用入门,创建一个Nginx服务器

运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 docker run -p 8080:80 --name nginx_web -it nginx /bin/bash 二.了解Nginx 镜像的配置文件位置 日志文件位置:/var/log/nginx 配置文件位置: /etc/nginx 资源存放的位置: /usr/share/nginx/html 上面的

Docker快速入门(二)

上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker 把应用程序及其依赖,打包在 image 文件里面.(2)只有通过这个image文件,才能生成 Docker 容器.image 文件可以看作是容器的模板.Docker 根据 image 文件生成容器的实例.(3)同一个 image 文件,可以生成多个同时运行的容器实例.(4)image 是二进制文件.实际开发中

Docker快速入门——Docker常用命令

Docker快速入门--Docker常用命令 一.Docker命令简介 1.Docker命令简介 Docker的命令清单可以通过运行sudo docker或者sudo docker help命令查看.Docker容器技术在不断演化过程中,Docker的子命令已经达到41个,其中核心子命令(例如:run)还会有复杂的参数配置.Docker命令根据功能和使用场景可以分为4个部分. 2.Docker用户组 Docker守护进程绑定的是一个unix ?socket,而不是TCP端口,默认的属主是root

Docker快速入门——Docker简介

Docker快速入门--Docker简介 一.Docker简介 1.Docker简介 Docker是Docker Inc公司开源的一项基于Ubuntu LXC技术构建的应用容器引擎,源代码托管在GitHub上,完全基于go语言开发并遵守Apache2.0协议开源.Docker可以让开发者打包应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的Linux版本机器上,也可以实现虚拟化.Docker容器完全使用沙箱机制,容器相互之间不会有任何接口,并且容器性能开销极低.Docker最初是在