一 Kubernetes
1 概述
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的一一编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理就在这个时候,kubernetes出现了
kubernetes的名字来自希腊语,意思是舵手或领航员k8s是将k和s之间的8个字母ubernete替换为8的缩写
k8s的创造者,是众人皆知的行业巨头一Google。k8s并不是一件全新的发明,他是Google10多年大规模容器管理技术Borg的开源版本。2014年6月k8s由Google公司正式公布出来并宣布开源
k8s 是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能
2 核心架构
master (管理节点)
- 提供集群的控制
- 对集群进行全局决策
- 检测和响应集群事件
核心组件
API Server
- 是整个系统的对外接口,供客户端和其它组件调用
- 后端元数据存储于etcd中(键值数据库)
Scheduler
- 负责对集群内部的资源进行分配和调度
ControllerManager
- 负责管理控制器,相当于大总管
etcd
- 存储kubernetes在运行过程中产生的所有元数据
服务端口
软件工具包
kubeadm:集群配置工具
kubelet:管理pod,在集群中的每个节点上启动
kubectl:用来与集群通信的命令行工具
contained:容器管理软件(Runtime)
ipvsadm:集群管理工具
iproute-tc:网络流量管理工具
node (计算节点)
- 运行容器的实际节点
- 提供运行环境
- 在多个节点上运行
- 水平扩展
Node核心组件
Kubelet
- 负责监视Pod、包括创建、修改、删除等
Kube-proxy
- 主要负责为Pod对象提供代理
- 实现service的通信与负载均衡
Runtime
- 容器管理(contained )
image (镜像仓库)
- 存储镜像
- 为节点提供镜像支持
仓库组件:Registry 或 Harbor
二 calico
1 概述
在虚拟化平台中,比如 OpenStack、Docker 等都需要实现workloads 之间互连,但同时也需要对容器做隔离控制,设置访问策略,calico 就可以解决以上所有问题
calico 可以让不同节点上的容器实现互联互通,同时也可以设置访问策略,它是一种容器之间网络互通的解决方案
2 优势
更节约资源:Calico 使用的三层路由方法,抑制二层广播减少了资源开销,并且具有可扩展性。
更容易管理:因为没有隧道,意味着 workloads 之间路径更短更简单,配置更少,更容易管理
更少的依赖: Calico 仅依赖三层路由可达
适配性广:较少的依赖性使它能适配所有 VM、Container、白盒或者混合环境场景。
三 kubeadm
常用选项
命令选项 | 命令说明 |
help | 命令帮助信息 |
version | 版本信息 |
config | 镜像管理命令 |
init | 集群初始化命令 |
reset | 还原、删除集群配置 |
join | 计算节点加入集群 |
token | token凭据管理 |
四 集群管理命令
kubectl 是用于控制 Kubernetes 集群的命令行工具
1 语法格式
kubectl [command] [TYPE] [NAME] [flags]
command:子命令,如create,get,describe,delete
type:资源类型,可以表示为单数,复数或缩写形式
name:资源名称,如果省略,则显示所有资源信息
flags:指定可选标识或附加的参数
2 集群信息管理命令
子命令 | 说明 | 备注 |
---|---|---|
help | 用于查看命令及子命令的帮助信息 | |
cluster-info | 显示集群的相关配置信息 | |
version | 查看服务器及客户端的版本信息 | |
api-resources | 查看当前服务器上所有的资源对象 | |
api-versions | 查看当前服务器上所有资源对象的版本 | |
config | 管理当前节点上kubeconfig 的认证信息 |
help
# 查看帮助命令信息
[root@master ~]# kubectl help version
Print the client and server version information for the current context.Examples:# Print the client and server versions for the current contextkubectl version
... ...
cluster-info
# 查看集群状态信息
[root@master ~]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.1.50:6443
CoreDNS is running at https://192.168.1.50:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
version
# 查看服务端与客户端版本信息
[root@master ~]# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short. Use --output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:58:30Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:"1", Minor:"26", GitVersion:"v1.26.0", GitCommit:"b46a3f887ca979b1a5d14fd39cb1af43e7e5d12d", GitTreeState:"clean", BuildDate:"2022-12-08T19:51:45Z", GoVersion:"go1.19.4", Compiler:"gc", Platform:"linux/amd64"}
api-resources
# 查看资源对象类型
[root@master ~]# kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
bindings v1 true Binding
endpoints ep v1 true Endpoints
events ev v1 true Event
... ...
api-versions
# 查看资源对象版本
[root@master ~]# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
... ...
config
# 查看当前认证使用的用户及证书
[root@master ~]# kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
# 使用 view 查看详细配置
[root@master ~]# kubectl config view
apiVersion: v1
clusters:
- cluster:certificate-authority-data: DATA+OMITTEDserver: https://192.168.1.50:6443name: kubernetes
contexts:
- context:cluster: kubernetesuser: kubernetes-adminname: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-adminuser:client-certificate-data: REDACTEDclient-key-data: REDACTED
主机管理授权
[root@harbor ~]# vim /etc/hosts
192.168.1.30 harbor
192.168.1.50 master
192.168.1.51 node-0001
192.168.1.52 node-0002
192.168.1.53 node-0003
192.168.1.54 node-0004
192.168.1.55 node-0005
[root@harbor ~]# dnf install -y kubectl
[root@harbor ~]# mkdir -p $HOME/.kube
[root@harbor ~]# rsync -av master:/etc/kubernetes/admin.conf $HOME/.kube/config
[root@harbor ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@harbor ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 24h v1.26.0
node-0001 Ready <none> 22h v1.26.0
node-0002 Ready <none> 22h v1.26.0
node-0003 Ready <none> 22h v1.26.0
node-0004 Ready <none> 22h v1.26.0
node-0005 Ready <none> 22h v1.26.0
五 Pod
1 概述
Pod 就像是豌豆英一样,它由一个或者多个容器组成
Pod 是Kubernetes中最小的管理元素
Pod 是一个服务的多个进程的聚合单位
安同一个 Pod共享网络IP及权限
同一个 Pod 共享主机名称
同一个 Pod 共享存储设备
2 创建过程
为什么要使用Pod?
- 服务之间有相关性
- 启动容器的时候需要初始化或进行相关配置
3 生命周期
Pod 对象自从创建开始至终止的时间范围称为其生命周期,在这段时间中Pod 处在多种不同的状态,并执行相关操作
创建主容器为必需的操作,其他为可选操作(初始化容器启动后钩子、存活性探测、就绪性探测以及终止前钩子等
4 相位状态
Pod的status字段是一个PodStatus的对象,Pod对象总是应该处于其生命进程中以下几个相位 (phase) 之一
Pending | Pod 创建过程中,但它尚未被调度完成 |
Running | Pod中所有容器都已经被创建成功 |
Completed | Pod 所有容器都已经成功终止,并不会被重启 |
Failed | Pod中的所有容器中至少有一个容器退出是非0状态 |
Unknown | 无法正常获取到Pod对象的状态信息 |
3 Pod核心管理命令(一)
子命令 | 说明 | 备注 |
run/create | 创建资源对象 | 可输出资源文件模板 |
get | 查看资源对象的状态信息 | 常用参数: -o 显示格式 |
describe | 查询资源对象的属性信息 | |
logs | 查看容器的报错信息 | 常用参数: -c 容器名称 |
run
# 创建 Pod
[root@master ~]# kubectl run myweb --image=myos:nginx
pod/myweb created# 查询资源对象
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb 1/1 Running 0 3s 10.244.1.3 node-0001[root@master ~]# curl http://10.244.1.3
Nginx is running !
get
语法格式:kubectl get 资源类型 [资源名称] [选项/参数]
常用参数:
-o name 只显示名字
-o wide 显示更加的详细信息
-o yaml 以 Yaml 语法格式显示资源对象
-o json 以 json 语法格式显示资源对象
# 查看 Pod 资源对象
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 10m
# 只查看资源对象的名字
[root@master ~]# kubectl get pods -o name
pod/myweb
# 查看资源对象运行节点的信息
[root@master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myweb 1/1 Running 0 10m 10.244.1.3 node-0001
# 查看资源对象详细信息,Yaml 格式
[root@master ~]# kubectl get pod myweb -o yaml
apiVersion: v1
kind: Pod
metadata:name: myweb
... ...
# 查看名称空间
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 39h
kube-node-lease Active 39h
kube-public Active 39h
kube-system Active 39h# 查看 kube-system 名称空间中的 Pod 信息
[root@master ~]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
etcd-master 1/1 Running 0 39h
kube-apiserver-master 1/1 Running 0 39h
kube-controller-manager-master 1/1 Running 0 39h
kube-scheduler-master 1/1 Running 0 39h
... ...
create
系统命名空间
default 默认的命名空间,不声明命名空间的Pod都在这里
kube-node-lease 为高可用提供心跳监视的命名空间
kube-public 公共数据,所有用户都可以读取它
kube-system 系统服务对象所使用的命名空间
注意:k8s 系统核心服务都运行在 kube-system 名称空间中
语法格式:kubectl create <资源对象> [选项/参数]
# 创建名称空间资源对象
[root@master ~]# kubectl create namespace work
namespace/work created# 查看名称空间
[root@master ~]# kubectl get namespaces
NAME STATUS AGE
default Active 39h
kube-node-lease Active 39h
kube-public Active 39h
kube-system Active 39h
work Active 11s
run
语法格式:kubectl run pod名称 [选项/参数]
# 创建简单 Pod 资源对象
[root@master ~]# kubectl -n work run myhttp --image=myos:httpd
pod/myhttp created# 查询资源对象
[root@master ~]# kubectl -n work get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
myhttp 1/1 Running 0 3s 10.244.2.2 node-0002# 访问验证
[root@master ~]# curl http://10.244.2.2
Welcome to The Apache.
describe
语法格式:kubectl describe 资源类型 [资源名称] [选项/参数]
Events 下是事务日志,常用于排错
# 查看资源对象的属性信息
[root@master ~]# kubectl describe pod myweb
Name: myweb
Namespace: default
Priority: 0
Service Account: default
Node: node-0001/192.168.1.51
... ...
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 16m default-scheduler Successfully assigned default/myweb to node-0001Normal Pulled 16m kubelet Container image "myos:nginx" already present on machineNormal Created 16m kubelet Created container mywebNormal Started 16m kubelet Started container myweb# 查看 work 名称空间下的 pod 信息
[root@master ~]# kubectl -n work describe pod myhttp
Name: myhttp
Namespace: work
Priority: 0
Service Account: default
Node: node-0002/192.168.1.52
... ...
logs
语法格式:kubectl logs Pod名称 [选项/参数]
# 访问服务,并查看日志
[root@master ~]# curl http://10.244.1.3/info.php
[root@master ~]# curl http://10.244.2.2/info.php
... ...
# 查看 myweb 日志
[root@master ~]# kubectl logs myweb
2022/11/12 18:28:54 [error] 7#0: *2 open() "/usr/local/nginx/html/info.php" failed (2: No such file or directory), client: 10.244.0.0, server: localhost, request: "GET /info.php HTTP/1.1", host: "10.244.2.12"
# 查看 myhttp 日志
[root@master ~]# kubectl -n work logs myhttp
[root@master ~]#
排错三兄弟
kubectl get、kubectl describe、kubectl logs
4 Pod核心管理命令(二)
子命令 | 说明 | 备注 |
---|---|---|
exec | 在某一个容器内执行特定的命令 | 可选参数: -c 容器名称 |
cp | 在容器和宿主机之间拷贝文件或目录 | 可选参数: -c 容器名称 |
delete | 删除资源对象 | 可选参数: -l 标签 |
exec
语法格式:kubectl exec [选项/参数] Pod名称 --操作命令
常用参数:-it 分配交互式终端
# 在容器内执行命令
[root@master ~]# kubectl exec myweb -- ls
50x.html
index.html
[root@master ~]# kubectl exec -it myweb -- /bin/bash
[root@myweb html]# ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450inet 10.244.1.3 netmask 255.255.255.0 broadcast 10.244.2.255ether 3a:32:78:59:ed:25 txqueuelen 0 (Ethernet)
... ...
cp
语法格式:kubectl cp [选项/参数] 原文件 目标文件
路径格式:[Pod名称:绝对路径]
# 与容器进行文件或目录传输
[root@master ~]# kubectl cp myweb:/etc/yum.repos.d /root/aaa
tar: Removing leading `/' from member names
[root@master ~]# tree /root/aaa
/root/aaa
├── local.repo
├── Rocky-AppStream.repo
├── Rocky-BaseOS.repo
└── Rocky-Extras.repo0 directories, 4 files
[root@master ~]# kubectl -n work cp /etc/passwd myhttp:/root/mima
[root@master ~]# kubectl -n exec myweb -- ls /root/
mima
delete
集群中所有资源均可使用 delete 命令删除
语法格式:kubectl delete [选项/参数] 资源类型 资源名称
# 删除资源对象
[root@master ~]# kubectl delete pods myweb
pod "myweb" deleted# 删除 work 名称空间下所有 Pod 对象
[root@master ~]# kubectl -n work delete pods --all
pod "myhttp" deleted# 删除名称空间
[root@master ~]# kubectl delete namespaces work
namespace "work" deleted
六 资源对象文件
1 概述
k8s中把可以创建或配置的应用和服务称为资源对象。Kubernetes 对象是“目标性记录”,使用这些对象去表示整个集群的状态。我们在集群中创建的 Pod、负载均衡、存储、网络服务等等都是资源对象,创建 Kubernetes 对象时,必须提供资源对象的一些基本信息(例如:资源的对象的名字),以及描述描述该对象的期望状态特征(规约),如果我们在文件中使用 Yaml 的语法格式描述了上面的信息,这个文件就是资源对象文件
为什么要使用资源对象文件?
- 命令无法持久化,没有历史记录,不方便重现
- 服务众多,多个容器之间有关联性,管理不方便
- 很多高级的复杂的功能靠简单的命令方式无法实现,这些都需要使用资源文件描述
2 作用
可以创建、删除、变更、管理资源对象
3 创建
简单资源对象可以使用“kubectI”直接创建
高级资源对象需要使用“资源对象文件”创建
4 最简单的资源对象文件
[root@master ~]# vim myweb.yaml
--- # Yaml文件起始标志
kind: Pod # 当前创建资源的类型
apiVersion: v1 # 当前资源对应的版本
metadata: # 属性信息,元数据name: myweb # 属性信息,资源的名称
spec: # 资源的特定描述containers: # 容器资源的特定描述- name: webserver # 容器的名称image: myos:nginx # 启动容器使用的镜像
status: {} # 资源状态,运行后自动生成
5 静态Pod
静态 Pod 是由 kubelet 守护进程直接管理的 Pod,不需要AP|服务器监管。与由控制面管理的 Pod 不同
kubelet 监视每个静态 Pod(在它崩溃之后重新启动)
静态 Pod 永远都会绑定到一个指定节点上的 Kubelet
静态Pod的spec不能引用其他 API对象
静态 Pod 配置路径: /var/lib/kubelet/config.yaml
6 资源文件管理命令
子命令 | 说明 | 备注 |
---|---|---|
create | 创建文件中定义的资源 | 支持指令式和资源对象文件配置 |
apply | 创建(更新)文件中定义的资源 | 只支持资源对象文件(声明式) |
delete | 删除文件中定义的资源 | 支持指令式和资源对象文件配置 |
注意:删除Pod后kubelet会自动重建Pod,删除资源文件才能彻底删除Pod
列如:rm -f /etc/kubernetes/manifests/myweb.yaml
命令语法:kubectl [create|apply|delete] -f 资源文件名称.yaml
create
# 创建资源对象
[root@master ~]# kubectl create -f myweb.yaml
pod/myweb created
# 不能更新,重复执行会报错
[root@master ~]# kubectl create -f myweb.yaml
Error from server (AlreadyExists): error when creating "myweb.yaml": pods "myweb" already exists
delete
# 使用资源对象文件删除
[root@master ~]# kubectl delete -f myhttp.yaml
pod "myhttp" deleted
[root@master ~]# kubectl get pods
No resources found in default namespace.
apply
# 创建资源对象
[root@master ~]# kubectl apply -f myweb.yaml
pod/myweb created
# 更新资源对象
[root@master ~]# kubectl apply -f myweb.yaml
pod/myweb configured
# 删除资源对象
[root@master ~]# kubectl delete -f myweb.yaml
pod "myweb" deleted# 拓展提高
# 与 kubectl apply -f myweb.yaml 功能相同
[root@master ~]# cat myweb.yaml |kubectl apply -f -