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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker从入门到掉坑(五):继续挖一挖 k8s

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


不熟悉的可以先回顾之前的章节,Docker教程系列文章将归置到菜单栏:连载中..->Docker一栏。


pod是啥


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


官方图片附上:


image.png


复制控制器(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容器。


基本的架构图如下所示:



image.png


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对变更友好,可以快速迭代增加新功能的基础。


END


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
14天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
148 77
|
6天前
|
Ubuntu 应用服务中间件 nginx
docker入门-快速学会docker
本文介绍了Docker的基本概念,包括镜像、容器、tar文件、Dockerfile和仓库,并通过实际操作演示了如何使用Docker。从拉取Nginx镜像、运行容器、修改容器内容、保存容器为新镜像,到使用Dockerfile构建自定义镜像,最后讲解了如何保存和恢复镜像。文中还推荐了一个在线实践平台Play with Docker,方便读者快速上手Docker。
33 4
docker入门-快速学会docker
|
26天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
29天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
24天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
43 1
|
24天前
|
Kubernetes 开发者 Docker
Docker与Kubernetes的协同工作
Docker与Kubernetes的协同工作
|
28天前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
12天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
72 1