《Kubernetes 入门实战课》 学习笔记 day2

191 阅读6分钟

大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。今天和大家一起学习 Kubernetes😊

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 31 天,点击查看活动详情

Dockerfile

构建镜像的第一条指令必须是 FROM,关注镜像安全和大小,一般选择 Alpine。关注应用的运行稳定性,可以选择 Ubuntu、Debian、CentOS

RUN 通常是 Dockerfile 里最复杂的指令,可以执行任意的 Shell 命令,所以会包含很多的 Shell 命令,一条指令只能是一行。有时候需要写很多 Shell 命令,这种情况建议单独集中在一个脚本文件里,用 COPY 命令拷贝进去再用 RUN 执行

环境变量有两种方式:ARG 和 ENV ,ARG 创建的变量只能在镜像构建过程中可见。而 ENV 创建的变量不仅可以在构建镜像过程中使用,还可以在容器运行时也能以环境变量的形式被应用程序使用

EXPOSE 指令用来声明容器对外服务的端口号

# Dockerfile
FROM alpine:3.15 # 选择基础镜像
COPY ./a.txt /tmp/a.txt # 将构建上下文里的 a.txt 拷贝到镜像的 /tmp 目录
CMD echo "hello world" # 启动容器时默认运行的命令
RUN cd /tmp && chmod +x setup.sh \ # 添加执行权限 
    && ./setup.sh && rm setup.sh # 运行脚本然后再删除

ARG IMAGE_BASE="node"  # 定义了基础镜像的名字
ENV PATH=$PATH:/tmp   # 使用 ENV 定义环境变量
EXPOSE 443            # 默认是 tcp 协议

dockerignore

可以在构建上下文的目录再建立一个 .dockerignore 文件,语法和 .gitignore 类似,排除不需要的文件

# docker ignore
*.swp
*.sh

实现网络互通

Docker 提供三种网络模式,分别是 null、host、bridge

null 是最简单的模式,也就是没有网络,但是允许其他的网络插件来自定义连接

host 是直接使用宿主机网络,相当于去掉容器的网络隔离,所有容器都共享主机的 IP 地址和网卡

docker run -d --rm --net=host nginx:alpine

bridge 也就是桥接模式,容器和宿主机通过虚拟网卡接入网桥,这样它们之间就可以正常收发网络数据包了。Docker 默认的网络模式就是 bridge

端口号映射需要使用 bridge 模式,并且在 docker run 启动容器时使用 -p 参数,用 : 分隔本机端口和容器端口

docker run -d -p 8080:80 --rm nginx:alpine # 将本机的 8080 端口映射到 80 端口

Kubernetes

Kubernetes 是一个生产级别的容器编排平台和集群管理系统,能够创建、调度容器、监控、管理服务器

官网推荐两个快速搭建 Kubernetes 的工具,一个是 kind ,一个是 minikube ,因为 kind 缺少很多 Kubernetes 的标准功能,例如仪表盘、网络插件,也很难定制化,所以选择 minikube 来学习

minikube

安装 minikube

# Intel x86_64
curl -Lo minikube <https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64>

# Apple arm64
curl -Lo minikube <https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64>

sudo install minikube /usr/local/bin/

安装好之后可以查看它的版本号

root@iZj6c05kpbkv4i8bbtitwuZ:~# minikube version
minikube version: v1.29.0
commit: ddac20b4b34a9c8c857fc602203b6ba2679794d3

kubectl 是一个与 Kubernetes、minikube 彼此独立的项目,所以不包含在 minikube 里,但 minikube 提供了安装它的简化方式

minikube kubectl

minikube 管理 Kubernetes 集群环境,kubectl 操作实际的 Kubernetes 功能

启动 minikube

minikube start --kubernetes-version=v1.23.3 # 指定 Kubernetes 版本

查看 Kubernetes 集群状态

root@iZj6c05kpbkv4i8bbtitwuZ:~# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

root@iZj6c05kpbkv4i8bbtitwuZ:~# minikube node list
minikube        192.168.49.2
root@iZj6c05kpbkv4i8bbtitwuZ:~#

在当前用户目录下的 .bashrc 增加以下别名和命令自动补全功能

alias kubectl="minikube kubectl --"
source <(kubectl completion bash)

重载生效之后再查看版本

source ~/.bashrc

root@iZj6c05kpbkv4i8bbtitwuZ:~# kubectl version --short
Client Version: v1.23.3
Server Version: v1.23.3

运行一个 nginx 应用并查看 pod

root@iZj6c05kpbkv4i8bbtitwuZ:~# kubectl run nginx --image=nginx:alpine
pod/nginx created
root@iZj6c05kpbkv4i8bbtitwuZ:~# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          13s

Kubernetes 基本架构

Kubernetes 采用了目前流行的 “控制面/数据面” 架构,控制面的节点在 Kubernetes 里叫做 Master Node,是整个集群中最重要的部分。数据面的节点称为 Worker Node,帮助 Master 工作。集群里的计算机被称为 “节点”

节点内部的结构

Kubernetes 节点内部是由很多模块组成,这些模块可以分为组件和插件两类

Master 里有 4 个组件,分别是 apiserver、etcd、scheduler、controller-manaager

apiserver 是 Master 节点-同时也是整个 Kubernetes 系统的唯一入口,对外公开了一系列 RESTful API,并且加上验证、授权等功能,所有其他组件都只能和它直接通信

etcd 是一个高可用的分布式 key-value 数据库,用来持久化存储系统里的各种资源对象和状态。它只和 apiserver 通信,所以任何组件想要读写 etcd 里的数据都需要经过 apiserver

scheduler 负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运行

controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸缩等功能

kubelet 是 Node 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它可以与 apiserver 通信,实现状态报告,命令下发,启停容器等功能

kube-proxy 是 Node 的网络代理,只负责管理容器的网络通信,可以理解为帮 Pod 转发 TCP / UDP 数据包,它是被容器化了

container-runtime 是容器和镜像的实际使用者,管理 Pod 的生命周期

Kubernetes 的大致工作流程了:每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使用相应的手段去调节恢复

插件

DNS 和 Dashboard

DNS 在 Kubernetes 集群里实现了域名解析服务,能够让我们以域名而不是 IP 地址来互相通信,是服务发现和负载均衡的基础

Dashboard 是仪表盘,为 Kubernetes 提供一个图形化的操作界面

此文章为3月Day4学习笔记,内容来源于极客时间《Kubernetes 入门实战课》 这门课真的非常好,推荐大家看看