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一直起不来
[root@localhost ~]# 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呢?
通过以下的命令来对容器进行删除即可:
[root@localhost k8s]# kubectl delete -f ./mysql-rc.yaml
replicationcontroller "mysql-rc" deleted
[root@localhost k8s]# kubectl delete -f ./mysql-svc.yaml
service "mysql-svc" deleted
[root@localhost k8s]# kubectl delete -f ./nginx-deployment.yaml
deployment.apps "nginx-deployment" deleted
[root@localhost 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详细信息
[root@localhost 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里面的详情描述内容
[root@localhost 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://nginx@sha256: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节点:
[root@localhost k8s]# kubectl delete pod nginx
pod "nginx" deleted
7.删除某台机器上边deployment信息:
[root@localhost 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对变更友好,可以快速迭代增加新功能的基础。
Docker从入门到掉坑(五):继续挖一挖 k8s的更多相关文章
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- Docker从入门到掉坑(三):容器太多,操作好麻烦
前边的两篇文章里面,我们讲解了基于docker来部署基础的SpringBoot容器,如果阅读本文之前没有相关基础的话,可以回看之前的教程. Docker 从入门到掉坑 Docker从入门到掉坑(二): ...
- Docker从入门到掉坑(四):上手k8s避坑指南
在之前的几篇文章中,主要还是讲解了关于简单的docker容器该如何进行管理和操作,在接下来的这篇文章开始,我们将开始进入对于k8s模块的学习 不熟悉的可以先回顾之前的章节,Docker教程系列文章将归 ...
- Docker 从入门到掉坑
Docker 介绍 简单的对docker进行介绍,可以把它理解为一个应用程序执行的容器.但是docker本身和虚拟机还是有较为明显的出入的.我大致归纳了一下,可以总结为以下几点: docker自身也有 ...
- Kotlin从入门到掉坑里
为什么要用Kotlin,和Java完全兼容,相互之间引用完全不是问题,所有没有什么负担. 使用Kotlin已经近一个月,基本上看完了语法就上正式项目了,期间几次准备放弃,最终坚持下来了.关于Kotli ...
- Docker从入门到精通(五)——Dockerfile
Dockerfile 简单来说就是一个包含用于组合镜像的命令的文本文档,Docker 通过读取 Dockerfile 中的指令就可以按步骤生成镜像,那么在制作镜像之前,我们先了解一下镜像的原理. 1. ...
- Docker快速入门(二)
上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...
- Docker 使用入门,创建一个Nginx服务器
运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 dock ...
- 【干货合集】Docker快速入门与进阶
收录待用,修改转载已取得腾讯云授权 Docker 在众多技术中,绝对是当红炸子鸡.这年头,如果你不懂一点容器,不学一些Docker,还怎么出去跟人炫耀技术? Docker 也是云计算技术中较为热门的一 ...
随机推荐
- 【java/Json】用Java对象构建Json语法树
本文后续:https://www.cnblogs.com/xiandedanteng/p/11973129.html 编译第一步:将文本解析成Java对象构成的语法树 第二步:将语法树输出整形好的Js ...
- 怎么设置cookie,怎么设置cookie以及删除cookie和cookie详解
在操作cookie之前,先来看一下cookie长什么样. 可以看到,cookie是一个个键值对(“键=值”的形式)加上分号空格隔开组合而成, 形如: "name1=value1; name2 ...
- http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天
http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天
- PPT插件(islide)
https://www.islide.cc/features iSlide 主要功能模块 一键优化 将PPT中不规则的字体,段落,色彩,参考线布局,风格样式等一键化全局统一设置,构建专业和规范. ...
- linux中c语言和php语言通信代码UDP&TCP
linux中c语言和php语言通信代码UDP&TCP http://blog.chinaunix.net/uid-24015214-id-2644174.html UDP方式通信 服务器端 ...
- Oracle数据库查看表空间sql语句
转: Oracle数据库查看表空间sql语句 2018-09-03 15:49:51 兰海泽 阅读数 6212 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出 ...
- setInterval调用ajax回调函数不执行的问题
setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...
- glib 检索地址
http://ftp.acc.umu.se/pub/GNOME/sources/glib/
- osg创建灯光
添加光照 osg::ref_ptr<osg::Node> MyOSGLoadEarth::CreateNode() { osg::ref_ptr<osg::Group> _ro ...
- Locust-参数化批量注册(还没试,目测试可以的)
前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复.例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...