企业级运维之云原生与Kubernetes实战课程 - 第三章 Kubernetes集群原理深度解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 理解容器和pod的基本原理以及差异理解pod创建的过程理解各个控制器的作用理解ack集群的网络原理以及coredns的原理

企业级运维之云原生与Kubernetes实战课程

第三章 Kubernetes集群原理深度解析

 

 

本章目标

 

  • 理解容器和pod的基本原理以及差异
  • 理解pod创建的过程
  • 理解各个控制器的作用
  • 理解ack集群的网络原理以及coredns的原理

 

本章目录

 

  • 深入剖析linux容器&Pod
  • 集群创建Pod的过程
  • 阿里云ACK集群控制器
  • 阿里云ACK集群网络

 

第三章第1讲 深入剖析linux容器&Pod(上)

 

视频地址:https://developer.aliyun.com/learning/course/913/detail/14532

 

目录

 

  • 什么是容器
  • 资源隔离(namespace
  • 资源限制(cgroup
  • Init容器
  • Pause容器
  • 最佳实践

 

一、什么是容器

 

容器提供了一种逻辑打包机制,以这种机制打包的应用,可以脱离其实际运行的环境。

 image.png

 

传统OS上应用的特点:

 

  • 应用进程可以互相看到,互相通信,意味着进程可以相互攻击;
  • 进程使用的同一个文件系统,可以对其他进程的文件进行增删改查;除此之外,进程间的依赖也可能会存在冲突;
  • 使用相同的宿主机资源,存在资源抢占的问题。

 

容器具有视图隔离、资源可限制、独立文件系统等特点,容器中用到的主要技术是命名空间隔离Namespace和控制器组Cgroup

 

二、命名空间隔离( namespace )

 

1.  什么是命名空间隔离

 

命名空间是对全局资源的一种抽象,命名空间使得一些进程只能看到自己相关的资源,但是对于命名空间外的其它进程是不可见的。使用命名空间隔离技术的一个例子就是容器。

 image.png

 

2.  Namespace类型

 

Linux 内核实现了6 Namespace

  • mount:隔离文件系统挂载点
  • Network:隔离网络资源
  • PID:隔离进程ID
  • UTS:隔离主机名和域名
  • User:隔离用户和用户组
  • IPC:进程间通信隔离

 

问题:不同的Pod之间资源是隔离的,而在同一个Pod里,多个容器间哪些资源是共享的?哪些是隔离的呢?

 

3.  Pod中共享的命名空间

 

UTShostnameNIS域名;IPC:进程间通信。

 

Yaml文件示例:

 

Pod编排文件,Pod中创建了nginxbusybox两个容器:

 

apiversion:apps/v1

kind: Deployment

metadata:

 labels:

   app: multi-containers

 name: multi-containers

spec:

 replicas:1

 selector:

   matchLabels:

     app:multi-containers

   template:

     metadata:

       labels:

          app:multi-containers

     spec:

       containers:

         - command:

             - sleep

             - '36000'

           image: 'nginx:1.7.9'

           imagePullPolicy: IfNotPresent

           name: nginx

         - command:

              - sleep

              - '360000'

           image: 'busybox:latest'

           imagePullPolicy: Always

           name: busybox

 

a.  Pod中共享UTS命名空间

 

一个pod里,有多个containers,他们之间共享hostname

UTS:最简单的namespace,只作用hostnameNIS域名两个资源。

 image.png

 

示例:

 

# kubectl get deployments.apps multi-containers

 

切换到nginxhostname

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash

# hostname

 

切换到busyboxhostname

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c busybox -- bash

# hostname

 

b.  Pod中共享IPC命名空间

 

IPC:进程间通信,只有同一个namespace的进程之间才能够通信,常用于MessageQ

 image.png

 

c.  Pod中共享NET命名空间

 

Net:网络相关资源隔离,如网络设备、路由表、防火墙(iptables) socket ( ss

netstat )等等。

在排查问题时,经常会出现网络丢包、连接不上、解析不了等各种各样的问题,如何通过抓包找到问题,这个将在后续介绍。

 image.png

 

示例:

 

# netstat -antpl

image.png

 

d.  非共享USER命名空间

 

USER :在不同的namespace中用户可以有相同的UIDGID ,它们之间互相不影响。

 

e.  Pod中非共享pid命名空间

 

PID:隔离进程的pid属性,即不同的namespace中的进程可以有相同的pid,相同的namespace 可以看到其他进程的pid

 image.png

image.png

 

f.  Pod中非共享mnt命名空间

 

MNT:隔离的是mount points (挂载点) ,即不同namespace下面的进程看到的文件系统结构是不同的。不同的containers依赖不同的环境,mnt去共享,会存在冲突。

 

非共享MNT示例:

image.png

 

示例:

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash

# ls -l

 image.png

 

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c busybox -- sh

# ls -l

 image.png

 

g.  超好用的commandlsns

 

lsns:列出有关所有当前可访问的名称空间或给定名称空间的信息。命名空间标识符是一个索引节点号。

 

常用参数:

 

-J  使用 JSON 输出格式

-l  使用列表格式的输出

-n  不打印标题

-r  使用原生输出格式

-u  不截断列中的文本

-t  名字空间类型(mnt, net, ipc, user, pid, uts, cgroup)

 

示例:

# lsns

image.png

# lsns -t net

image.png

 

# lsns -t mnt

 image.png

 

# ps -ef |grep tomcat

# ps -ef |grep 1208542

# ps -ef |grep 1208523

 image.png

 

# pstree -sp 1208608

# ps -ef |grep 1208523

image.png

 

h.  超好用的commandnsenter

 

nsenter:在指定进程的指定命令空间下运行指定程序的命令,它最典型的用途就是进入容器的网络命令空间。

 

用法:

nsenter [options] <program> [<argument>...]

Run a program with namespaces of other processes.

 

选项:

-t, --target <pid>     要获取名字空间的目标进程

-m, --mount[=<file>]   enter mount namespace

-u, --uts[=<file>]     enter UTS namespace (hostname etc)

-i, --ipc[=<file>]     enter System V IPC namespace

-n, --net[=<file>]     enter network namespace

-p, --pid[=<file>]     enter pid namespace

-U, --user[=<file>]    enter user namespace

-S, --setuid <uid>     set uid in entered namespace

-G, --setgid <gid>     set gid in entered namespace

    --preserve-credentials do not touch uids or gids

-r, --root[=<dir>]     set the root directory

-w, --wd[=<dir>]       set the working directory

-F, --no-fork          执行 <程序> 前不 fork

-Z, --follow-context   set SELinux context according to --target PID

 

-h, --help    显示此帮助并退出

-V, --version 输出版本信息并退出

 

命令解析:

 image.png

 

演示示例:

 

# ipconfig eth0

# kubectl get pods multi- containers-6695d87b75-dsxgn -o wide

 image.png

 

# docker ps |grep multi

# docker inspect 0683e462045a |grep -i -pid

# lsns -p 905215

image.png

 

# nsenter -n -t 905215

# tcpdump -i any host 223.5.5.5 -nnvv -xxx & [1]1015386

 image.png

 

# pkill tcpdump

# lsns -p 905215

# nsenter -p -m -t 905215

 image.png

 

# nsenter -p -m -i -u -n -t 905215

# ps -ef

image.png

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
自然语言处理 编译器 Linux
|
1月前
|
UED
<大厂实战经验> Flutter&鸿蒙next 中使用 initState 和 mounted 处理异步请求的详细解析
在 Flutter 开发中,处理异步请求是常见需求。本文详细介绍了如何在 `initState` 中触发异步请求,并使用 `mounted` 属性确保在适当时机更新 UI。通过示例代码,展示了如何安全地进行异步操作和处理异常,避免在组件卸载后更新 UI 的问题。希望本文能帮助你更好地理解和应用 Flutter 中的异步处理。
65 3
|
1月前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
106 1
|
27天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
1月前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
43 0
|
3天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
21天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
22天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
24天前
|
消息中间件 存储 Cloud Native
云原生架构下的数据一致性挑战与应对策略####
本文探讨了在云原生环境中,面对微服务架构的广泛应用,数据一致性问题成为系统设计的核心挑战之一。通过分析云原生环境的特点,阐述了数据不一致性的常见场景及其对业务的影响,并深入讨论了解决这些问题的策略,包括采用分布式事务、事件驱动架构、补偿机制以及利用云平台提供的托管服务等。文章旨在为开发者提供一套系统性的解决方案框架,以应对在动态、分布式的云原生应用中保持数据一致性的复杂性。 ####
|
5天前
|
弹性计算 运维 Cloud Native
云原生架构的崛起与未来展望
在数字化转型的浪潮中,云原生架构凭借其高效、灵活和可扩展的特性,正逐渐成为企业IT战略的核心。本文旨在探讨云原生架构的定义、关键特性、实施优势以及面临的挑战,同时展望未来的发展趋势。通过深入分析,我们期望为读者提供一个关于云原生架构全面而深入的视角,助力企业在云计算时代做出更明智的决策。
16 3