kubernetes
- Kubernetes核心概念
❖ 快速部署一个Kubernetes集群
❖ Kubernetes将弃用Docker!
❖ kubectl管理工具
❖ Kubernetes基本资源概念
❖ 资源编排(YAML)
有了Docker,为什么还用Kubernetes?
docker 单机的 k8s集群编排 管理docker
14年 docker -》 k8s/messos - 16nian swarm
k8s官网
kubernetes 集群架构与组件
管理节点:
API server API
scheduler 调度器
contorller manager 控制器
ETCD k8s的数据库
工作节点:
kubeleet node 的agent
kube-proxy 容器的网络通信
docker 容器引擎
部署方式
kubeadm
二进制
配置 测试环境
配置推荐
常用命令
查看(排错)类
kubectl get cs 查看master组件状态
kubectl get node 查看node状态:
kubectl describe <资源类型> <资源名称>
kubectl apply -f calico.yaml 部署yaml
kubectl delete -f calico.yaml 卸载yaml
kubectl get <资源类型> <资源名称> # -o wide、-o yam 查看资源信息:
kubectl 创建。。。。
类型 命令 描述
基础命令
create 通过文件名或标准输入创建资源
expose 为Deployment,Pod创建Service
run 在集群中运行一个特定的镜像
set 在对象上设置特定的功能
explain 文档参考资料
get 显示一个或多个资源
edit 使用系统编辑器编辑一个资源。
delete 通过文件名、标准输入、资源名称或标签选择器来删除资源。
部署命令
rollout 管理Deployment,Daemonset资源的发布(例如状态、发布记录、回滚等)
scale 对Deployment、ReplicaSet、RC或Job资源扩容或缩容Pod数量
autoscale 为Deploy, RS, RC配置自动伸缩规则(依赖metrics-server和hpa)
集群管理命令
certificate 修改证书资源
cluster-info 显示集群信息
top 查看资源利用率(依赖metrics-server)
cordon 标记节点不可调度
uncordon 标记节点可调度
drain 驱逐节点上的应用,准备下线维护
taint 修改节点taint标记
官方文档参考地址:https://kubernetes.io/zh/docs/reference/kubectl/overview
故障诊断和
调试命令
describe 显示资源详细信息
logs 查看Pod内容器日志,如果Pod有多个容器,-c参数指定容器名称
attach 附加到Pod内的一个容器
exec 在容器内执行命令
port-forward 为Pod创建本地端口映射
proxy 为Kubernetes API server创建代理
cp 拷贝文件或目录到容器中,或者从容器内向外拷贝
auth 检查授权
debug 创建调试会话,用于排查工作负载和工作节点故障
高级命令
diff 将在线配置与指定的文件对比
apply 从文件名或标准输入对资源创建/更新
patch 使用补丁方式修改、更新资源的某些字段
replace 从文件名或标准输入替换一个资源
kustomize 从目录或者URL构建kustomization目标
设置命令
label 给资源设置、更新标签
annotate 给资源设置、更新注解
completion kubectl工具自动补全,source <(kubectl completion bash) (依赖软件包 bash-completion)
其他命令
api-resources 查看所有资源
api-versions 打印受支持的API版本
config 修改kubeconfig文件(用于访问API,比如配置认证信息)
version 查看kubectl和k8s版本
--apiserver-advertise-address string 设置 apiserver 绑定的 IP.
--apiserver-bind-port int32 设置apiserver 监听的端口. (默认 6443)
--apiserver-cert-extra-sans strings api证书中指定额外的Subject Alternative Names (SANs) 可以是IP 也可以是DNS名称。 证书是和SAN绑定的。
--cert-dir string 证书存放的目录 (默认 "/etc/kubernetes/pki")
--certificate-key string kubeadm-cert secret 中 用于加密 control-plane 证书的key
--config string kubeadm 配置文件的路径.
--cri-socket string CRI socket 文件路径,如果为空 kubeadm 将自动发现相关的socket文件; 只有当机器中存在多个 CRI socket 或者 存在非标准 CRI socket 时才指定.
--dry-run 测试,并不真正执行;输出运行后的结果.
--feature-gates string 指定启用哪些额外的feature 使用 key=value 对的形式。
--help -h 帮助文档
--ignore-preflight-errors strings 忽略前置检查错误,被忽略的错误将被显示为警告. 例子: 'IsPrivilegedUser,Swap'. Value 'all' ignores errors from all checks.
--image-repository string 选择拉取 control plane images 的镜像repo (default "k8s.gcr.io")
--kubernetes-version string 选择K8S版本. (default "stable-1")
--node-name string 指定node的名称,默认使用 node 的 hostname.
--pod-network-cidr string 指定 pod 的网络, control plane 会自动将 网络发布到其他节点的node,让其上启动的容器使用此网络
--service-cidr string 指定service 的IP 范围. (default "10.96.0.0/12")
--service-dns-domain string 指定 service 的 dns 后缀, e.g. "myorg.internal". (default "cluster.local")
--skip-certificate-key-print 不打印 control-plane 用于加密证书的key.
--skip-phases strings 跳过指定的阶段(phase)
--skip-token-print 不打印 kubeadm init 生成的 default bootstrap token
--token string 指定 node 和control plane 之间,简历双向认证的token ,格式为 [a-z0-9]{6}\.[a-z0-9]{16} - e.g. abcdef.0123456789abcdef
--token-ttl duration token 自动删除的时间间隔。 (e.g. 1s, 2m, 3h). 如果设置为 '0', token 永不过期 (default 24h0m0s)
--upload-certs 上传 control-plane 证书到 kubeadm-certs Secret.
kubeadm 部署k8s集群
初始化:
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
关闭 selinux
关闭swap
swapoff -a && sed -ri 's/.*swap.*/#&/g' /etc/fstab && setenforce 0
配置主机名
cat > /etc/hosts << EOF
192.168.60.66 master
192.168.60.60 node1
192.168.60.61 node2
> EOF
配置hosts
将桥接的ipv4的流量桥接到iptables的链(官方建议 不加可能会丢包)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system 生效
时间同步
yum install ntpdate -y
ntpdate time.windows.com
1. 安装docker 【所有节点】
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install docker-ce-19.03.5 docker-ce-cli-19.03.5 containerd.io
systemctl enable docker && systemctl start docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
systemctl restart docker
docker info
2. 创建master节点
部署 kubeadm,kubelet和kubectl
配置阿里源 :
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0 注:版本一致 kubectl 默认在master装就行
systemctl enable kubelet
拉取镜像
kubeadm config images pull \
> --image-repository registry.aliyuncs.com/google_containers \
> --kubernetes-version v1.21.0
在(Master)执行。
kubeadm init \
--apiserver-advertise-address=masterip \ master
--image-repository registry.aliyuncs.com/google_containers \ 指定国内镜像地址
--kubernetes-version v1.21.0 \ kubeadm 的版本 要与安装时一致
--service-cidr=10.96.0.0/12 \ k8s内部的网络 pod的访问入口 svc的ip
--pod-network-cidr=10.244.0.0/16 \ pod 的网段 ip
--ignore-preflight-errors=all 忽略检查的错误 检查搭建条件
····
• --apiserver-advertise-address 集群通告地址
• --image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
• --kubernetes-version K8s版本,与上面安装的一致
• --service-cidr 集群内部虚拟网络,Pod统一访问入口 svc的ip
• --pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
配置kubectl配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
配置完成后 测试
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 24m v1.21.0
node1 NotReady <none> 18m v1.21.0
node2 NotReady <none> 17m v1.21.0
注:由于网络插件还没有部署,还没有准备就绪 NotReady
3. 加入node节点
kubeadm join 192.168.60.66:6443 --token ryp1ab.awp8iabz70lv6fgv \
--discovery-token-ca-cert-hash sha256:d893733cf80e6b72d0789a2112ac1c4a6c807b6e2dae15f82fe7e3681a789c40
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:
kubeadm token create
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
4. 部署网络 CNI
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
拍错方法:kubectl get pods calico-node-b4nvf -n kube-system -o yaml | grep image
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
找到port = 0 注释
解决kubectl get cs 报错
安装目录:/etc/kubernetes/
组件配置文件目录:/etc/kubernetes/manifests/
5. 部署web UI
测试访问
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d2h
service/nginx NodePort 10.101.106.30 <none> 80:32645/TCP 48s
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.3/aio/deploy/recommended.yaml --no-check-certificate
vim recommended.yaml
pec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
nodePort: 30001
selector:
k8s-app: dashboard-metrics-scraper
完成后 apply
[root@master ~]# kubectl get pod -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5594697f48-5mkzl 1/1 Running 0 4m11s
kubernetes-dashboard-5c785c8bcf-kr4b8 1/1 Running 0 5m15s
[root@master ~]#
访问地址:https://NodeIP:30001
创建service account并绑定默认cluster-admin管理员集群角色:
# 创建用户
kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
输入token后登陆
pod
services
。。。
常用命令
kubectl scale --replicas=1 deployment web-biaoqian 扩容副本
部署pod,svc
默认部署集群后,master具有管理能力,node无法进行查看pod等操作
这时候 可以进行将master中的 scp /etc/kubernetes/admin.conf node1:/root/.kube/config
进行复制到node node就可以进行操作 get等命令了
- 先创建一个pod
kubectl create deploy pod-name --image=ngixn
- 创建svc
kubectl create svc pod-name clusterip --tcp=80:80
访问模式
一般访问svc的时候 用的是svc的name
curl curl ngx-001.default.svc.cluster.local.
这个格式一般是 svc-name.svc-namespace.svc(默认格式).k8s的域名 kubeadm init --help | grep dom
前提需要将kube-dns的ip写到 ll /etc/resolv.conf
clusterip 仅k8s集群可以访问
kubectl create svc pod-name clusterip --tcp=80:80
nodeport svc暴露外部端口
kubectl create svc nodeport svc-001 --tcp=80:80
kubectl api-resources 所有资源 名称 缩写 版本
管理pod
kubernetes 弃用docker
简短来说 就是containerd一开始集成在docker中 调用起来很麻烦 后期cortainerd 脱离出来,可以直接调用他
docker与k8s之间就像一条河流 在之间 docker 内集成了docker shim的容器化运行时接口 在弃用时 就是弃用这个插件,
切换docker为containerd
8.
切换容器引擎为Containerd
参考资料:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#containerd
1、配置先决条件
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
2、安装containerd
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
3、修改配置文件
• pause镜像设置过阿里云镜像仓库地址
• cgroups驱动设置为systemd
• 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址
vi /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
...
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
4、配置kubelet使用containerd
vi /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --cgroup-driver=systemd
systemctl restart kubelet
5、验证
kubectl get node -o wide
k8s-node1 xxx containerd://1.4.4
6、管理容器工具
containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。
项目地址:https://github.com/kubernetes-sigs/cri-tools/
设置crictl连接containerd:
vi /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
下面是docker与crictl命令对照表:
镜像相关功能 Docker Containerd
显示本地镜像列表 docker images crictl images
下载镜像 docker pull crictl pull
上传镜像 docker push 无,例如buildk
删除本地镜像 docker rmi crictl rmi
查看镜像详情 docker inspect IMAGE-ID crictl inspecti IMAGE-ID
容器相关功能 Docker Containerd
显示容器列表 docker ps crictl ps
创建容器 docker create crictl create
启动容器 docker start crictl start
停止容器 docker stop crictl stop
删除容器 docker rm crictl rm
查看容器详情 docker inspect crictl inspect
attach docker attach crictl attach
exec docker exec crictl exec
logs docker logs crictl logs
stats docker stats crictl stats
POD 相关功能 Docker Containerd
显示 POD 列表 无 crictl pods
查看 POD 详情 无 crictl inspectp
运行 POD 无 crictl runp
停止 POD 无 crictl stopp
常见问题
搭建集群可能会遇到的问题?
1、kubeadm init未执行完成,提示失败
- 系统不满足,例如机器配置低、swap没关闭
- yum update -y
2、如果init失败,修复问题后,应该执行kubeadm reset再执行init
3、calico镜像下载失败
grep image calico.yaml获取镜像地址,手动在所有节点docker pull那4个镜像
然后重新部署:
kubectl delete -f calico.yaml
kubectl apply -f calico.yaml
4、kubectl get cs 两个组件连接拒绝
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
vi /etc/kubernetes/manifests/kube-scheduler.yaml
分别注释(前面加#)--port=0参数,等待2分钟即可
kubectl api-resources #查看所有资源
跨主机容器通信面临的问题?
Q:
1、每个docker主机有自己独立的网络(172.17.0.0/24)
2、容器ip是随机分配,有可能一样,无法满足通信条件
3、即使分配不一样ip,两个内部网络不在宿主机网络的管辖范围内,还是实现不了通信
A:
1、给每个docker主机分配一个唯一的网段,docker启动参数可以指定
2、能够让源容器宿主机知道目标容器宿主机的对应的IP(172.17.1.0/24 -> 192.168.31.71,172.17.2.0/24 -> 192.168.31.72)
3、有了IP对应关系表,如何让宿主机使用?可以使用iptables(NAT)、配置路由表(开启路由转发)
CNI 容器网络接口
CRI 容器运行时接口
CSI 容器存储接口
什么时候删除dockershim?
1.23版本
docker值得学嘛?
值得
切换containerd问题?
1、不能平滑升级,这是两个容器运行时,需要按节点维护来做
2、docker与containerd节点可以共存(不是太建议长期这样)、
3、containerd完全兼容之前的容器镜像
crictl不支持镜像构建和推送。可以使用像buildx、buildah实现这块
命令补全:
yum install bash-completion -y
bash
source <(kubectl completion bash)
镜像来源:
- 镜像地址不带网址(域名或者ip),默认是docker hub(hub.docker.com)
- 带网址,走私有或者其他公共仓库
kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort
--port 指定service端口,集群中的pod访问我
--target-port 容器中服务的运行端口
kubectl get ep # endpoints,用于查看service关联pod ip
kubectl get pods --show-labels # 查看资源的标签
kubectl get pods -l app=java-demo # 根据标签筛选资源
应用1:app=java-demo
应用2:app=web
每个应用对应的service(Selector:app=web)都是根据这个标签关联pod
命名空间 = 工作空间
标签格式:
1、定义两个标签
project: www
app: nginx
2、matchLabels必须与下面labels(pod)保持一致,如果不一致会报错
kubectl create # 创建资源
kubectl apply # 创建或者更新资源
kubectl create deployment web --image=nginx --dry-run=client -o yaml > deployment.yaml
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort --dry-run=client
--dry-run=client # 只尝试运行,不实际创建(client在kubectl自己测试,server是提交到K8s API测试)
-o yaml # 导出yaml
快速部署pod svc
kubectl create deployment web --image=nginx
kubectl get deployments pods
kubectl get deployments,pods
kubectl expose deployment web --port=80 --type=NodePort --name=web
kubectl get svc
yaml 声明示 explain 解释资源
编写yaml
kubectl explain pods.spec.containers.imagePullPolicy
explain 改命令可以查看阶段性的资源字段
required- 这个字段表示 必须有
kubectl explain pods.spec | grep requi
containers <[]Object> **-required-**
- o yaml 可以导出yaml实例
实例: kubectl get pod pod-demo-2 -o yaml > 输出到文本 进行改动
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
name: pod-demo
namespace: test-001
spec:
containers:
- image: nginx
imagePullPolicy: Always 如果目标节点没有镜像怎么办 就要拖镜像 怎么拖 就用imagePullPolicy
*imagePullPolicy 有三个值:
Always 无论本地有没有 都去互联网拖一个 覆盖原来的
Never 如果本地没有 就不启动
IfNotPresent 本地有 目标节点有 就用 没有才拖*
name: nginx 当前容器的名字
resource:{定义这个容器使用的资源 比如cpu 内容 可以定义上下限制}
dnsPolicy: ClusterFirst 使用什么dns策略ClusterFirst 默认优先使用k8s集群上的dns服务器
enableServiceLinks: true 是否可以允许 service引用
nodeName: 允许 node调度到那个节点
priority: 0 制定pod的优先级
restartPolicy: Always 一旦pod中容器down掉 就重启 重启策略
schedulerName: default-scheduler使用哪个调度器进行调度
securityContext: {定义安全上下文}
serviceAccount: 服务账号
terminationGracePeriodSeconds 终止的宽限期
tolerations 容忍度(污点)
pod网络
··· hostNetwork: true 共享宿主机的网络名称空间
apiVersion: v1
kind: Pod
metadata:
name: pod-netwk
namespace: network
spec:
containers:
name: netwok
image: busybox:latest
hostNetwork: true 共享宿主机的网络
···
ports 指定暴露的端口 使用宿主机的单一端口映射 只有单一被调度的node才可以
kubectl explain pods.spec.contriners.ports
apiVersion: v1
kind: Pod
metadata:
name: pod-port
namespace: network
spec:
containers:
- name: port
image: busybox:latest
command: ['/bin/sh','-c','sleep 86400']
# hostNetwork: true
ports:
- protocol: TCP
containerPort: 80
name: ports
hostPort: 8080 宿主机的hostPort端口 与containerPort 建立dnet关系
kubectl apply -f pod-demo.yaml
kubectl apply -f pod-demo.yaml 使用yaml创建
进入容器
kubectl exec pod-demo-2 -c bbox -n default -it -- /bin/sh
一个pod中有多个容器 用-c 指定容器 -n 命名空间 -it -- /bin/sh 注意格式 -- 左右都有空格
两个容器显示
查看容器日志
标签 kubectl get pods --show-labels
(键值 不得超过63个字符)
键值 存在
yaml 中显示
metadata:
name: pod-demo-2
namespace: default
*labels:* 可以有多个标签
app: pod-demo2
rel: stables
kubectl label
添加 kubectl label pod pod-demo-2 BOE=demo
删除 kubectl label pod pod-demo-2 BOE- - 减号代表删除
修改 --overwrite kubectl label pod pod-demo-2 BOE=test --overwrite
查看 -l
键等于值 kubectl get pod --show-labels -l app=ngx-001
键不等于值 kubectl get pod --show-labels -l app!=ngx-001
且的关系 kubectl get pod --show-labels -l "app in (nginx,ngx-001)"
查看 -L
将app作为列显示
[root@master yaml]# kubectl get pod --show-labels -l "app in (nginx,ngx-001)" -L app
NAME READY STATUS RESTARTS AGE *APP* LABELS
nginx-6799fc88d8-jh6gh 1/1 Running 0 14d nginx app=nginx,pod-template-hash=6799fc88d8
ngx-001-586cbd5bf5-2qtqm 1/1 Running 0 8d ngx-001 app=ngx-001,pod-template-hash=586cbd5bf5
ngx-001-586cbd5bf5-7ptnj 1/1 Running 0 8d ngx-001 app=ngx-001,pod-template-hash=586cbd5bf5
ngx-001-586cbd5bf5-h4nfr 1/1 Running 0 8d ngx-001 app=ngx-001,pod-template-hash=586cbd5bf5
过滤此app键 的
kubectl get pods --show-labels -l '!BOE'
通过键值进行查看
资源注解 annotations
没有字符限制
yaml kubectl explain pod.metadata | grep anno
metadata:
name: pod-demo-2
namespace: default
labels:
app: pod-demo2
rel: stables
*annotations:*
ik8s.io/project: hello
Labels: BOE=test
app=pod-demo2
rel=stables
Annotations: cni.projectcalico.org/podIP: 10.244.166.138/32
cni.projectcalico.org/podIPs: 10.244.166.138/32
ik8s.io/project: hello
pod的生命周期
kubectl explain pods.spec.containers.lifecycle
**postStart 容器启动之后
preStop 容器停止之前**
https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/ 官网网址
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sle ep 1; done"]
- 运用最多的 livenessProbe readinessProbe
kubectl explain pods.spec.containers.livenessProbe
GitHub的地址(示例)https://github.com/iKubernetes/Kubernetes_Advanced_Practical
failureThreshold 状态探测失败几次才认得 默认为3
successThreshold 成功几次才认定为成功 默认为1 且只能是1
periodSeconds 检查周期 默认十秒
initialDelaySeconds 初始化多久检查
timeoutSeconds 每次检测等待时间 默认为1 且只能是1
kubectl explain pods.spec.containers.readinessProbe
spec:
containers:
- name: readiness-demo
image: busybox
args: ["/bin/sh", "-c", "while true; do rm -f /tmp/ready; sleep 30; touch /tmp/ready; sleep 300; done"]
readinessProbe:
exec:
command: ["test", "-e", "/tmp/ready"]
initialDelaySeconds: 5
periodSeconds: 5
pod 对象的相位
pending 调度不成功 可能是资源不足
pod的重启策略
Always 但凡pod被终止就将其重启 此为默认策略
OnFailure 仅在pod对象出现错误时才将其重启
Never 从不重启
资源限制
kubectl explain pods.spec.containers.resources
cpu.limits 上限不小于
cpu.requests 下限不小于
spec:
containers:
- name: simmemleak
image: saadali/simmemleak
resources:
requests: 不能小于64m
memory: "64Mi"
cpu: "1"
limits: 不能da于64m
memory: "64Mi"
cpu: "1"
pod 服务质量 Qos class
定义了上下限 就会有Qos class
QoS Class: Guaranteed 定义了上下限cpu资源 且值一样 优先级最高
pod中至少一个容器设置了一个 request 但不满足Guaranteed
BestEffort
pod control:
ReplicaSet
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs
spec:
replicas: 2 几个pod
selector:
matchLabels: 标签
app: myapp-pod
template:
metadata:
labels:
app: myapp-pod 创建出啦的pod用那个标签
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
[root@master chapter5]# kubectl get replicasets.apps myapp-rs
NAME 名字 DESIRED 期望几个pod CURRENT 当前有几个pod READY 就绪的pod AGE 多久前创建的
myapp-rs 2 2 2 45s
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-dp
namespace: test-001
spec:
replicas: 3
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: nginx
rel: stable
template:
metadata:
labels:
app: nginx
rel: stable
spec:
containers:
- name: my-ngx
image: nginx:1.11-alpine
ports:
- containerPort: 80
name: http
readinessProbe:
periodSeconds: 1
httpGet:
path: /
port: http
这个是有ReplicaSet来控制pod的 当更新的时候 老的rs依然存在,只不过被新的rs所取代,不在用老的rs调用
当升级deployment时 会重新创建rs pod名儿就是rs名称假随机后缀 并且默认为先创建一个起一个删一个
可以 自定义 kubectl explain deployment.spec.strategy
rollingUpdate 滚动更新
Recreate
spec:
replicas: 3
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
spec:
replicas: 3
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1 最多允许多一个
maxUnavailable: 1 最少允许shao一个
type: RollingUpdate 策略
查看 kubectl describe deployments.apps -n test-001 | grep RollingUpdateStrategy -B 2 -C 2
service
默认是ClusterIP 只能在集群内部被路由 被访问
TYPE ClusterIP
NodePort
LoadBalancer
kubectl expose deployment web-biaoqian --port=80 --target-port=80 --port=443 --name=httpds --target-port=443 --dry-run=client -o yaml
Deployment 在所有节点都运行一个pod 默认只能是一个副本 缩写(ds)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web-biaoqian
spec:
replicas: 5
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx:1.17
name: nginx
resources: {}
services 控制器
在这里插入代码片
多端口场景
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web-5
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
nodePort: 30002
selector:
app: web
type: NodePort
status:
loadBalancer: {}
service 多端口暴露
apiVersion: v1
kind: Service
metadata:
labels:
app: web
name: web-all
spec:
ports:
- name: ip #指定nane
port: 80 #第一个端口
protocol: TCP
targetPort: 80
- name: ssl #name
port: 443
protocol: TCP #协议
targetPort: 443 #容器内部端口
selector:
app: web #标签
type: NodePort #类型
service iptables 代理模式
可以先查看下 当前有的pod,svc 以及关联的状态
kubectl get svc,pod,ep -o wide
iptables-save | grep web-biaoqian #针对pob-name 过滤下规则
ipvs 代理模式
kubectl edit configmaps -n kube-system kube-proxy 想要全部节点生效 必须重启全部节点的proxy
[root@k8s-m2022-02 ~]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-8db96c76-nkln2 1/1 Running 0 4d6h
calico-node-8rwk9 1/1 Running 0 4d6h
calico-node-9bcfq 1/1 Running 0 4d6h
calico-node-rsdwx 1/1 Running 0 4d6h
coredns-545d6fc579-kdm74 1/1 Running 0 60d
coredns-545d6fc579-t5cj4 1/1 Running 0 60d
etcd-k8s-m2022-02 1/1 Running 3 60d
kube-apiserver-k8s-m2022-02 1/1 Running 3 60d
kube-controller-manager-k8s-m2022-02 1/1 Running 5 59d
kube-proxy-4hdm9 1/1 Running 0 11h
kube-proxy-85qr7 1/1 Running 0 60d
kube-proxy-bj57t 1/1 Running 3 60d
kube-scheduler-k8s-m2022-02 1/1 Running 2 24d
service dns
默认部署在 kube-system namespace
[root@k8s-m2022-02 ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 60d
[root@k8s-m2022-02 ~]# kubectl exec -it ds-busybox-c82sd -- sh 进入容器查看默认的dns 地址
dns默认格式 svc名称.namespace-name.svc.cluster.local
# cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local openstacklocal
options ndots:5
#
进阶
INgress是什么
ConfigMap
ConfigMap是一个K8s存储资源,用于存储应用程序配置文件。
数据卷
临时卷
apiVersion: v1
kind: Pod
metadata:
labels:
run: my-cen
name: my-cen
spec:
containers:
- image: centos
name: write
command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello; sleep 1; done"]
volumeMounts:
- name: data
mountPath: /data
- image: centos
name: read
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data # data 创建临时卷
emptyDir: {}
~
存放在宿主机 /var/lib/kubelet/pods/{pod-id}/volumes/kubernetes.io~empty-dir/data
挂在宿主机目录
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: test
image: busybox
args:
- /bin/sh
- -c
- sleep 36000
volumeMounts:
- name: data
mountPath: /data
- name: root
mountPath: /root-t
- name: tmp
mountPath: /tmp
volumes:
- name: data
hostPath:
path: /tmp
type: Directory
- name: root
hostPath:
path: /
type: Directory
- name: tmp
emptyDir: {}
nfs
共享存储
1 节点故障(pod故障)
2 多pod副本数据共享
创建一个nfs服务器 在所有节点安装nfs的包
yum install nfs-utils
# vi /etc/exports
/ifs/kubernetes *(rw,no_root_squash) nfs配置文件
mkdir -p /ifs/kubernetes 创建共享文件目录
systemctl start nfs 启动
systemctl enable nfs 开机自启
[root@k8s-m2022-02 voluem]# cat nfs.yaml
apiVersion: apps/v1 版本
kind: Deployment
metadata:
labels:
app: nfs-web
name: nfs-web
spec:
replicas: 3
selector:
matchLabels:
app: nfs-web
strategy: {}
template:
metadata:
labels:
app: nfs-web
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nfsroot #nfs-name
mountPath: /usr/share/nginx/html # 挂在到pod中的目录
resources: {}
volumes:
- name: nfsroot #nfs-name
nfs: #nfs类型的格式
server: k8s-node2 #nfs存储服务器
path: /mnt/nfs #nfs 服务共享的目录
创建services
暴露端口后测试
kubectl expose deployment nfs-web --port=80 --target-port=80 --type=NodePort
ssl
kubectl create secret tls www.huweiqi.top --cert=www.huweiqi.top.pem --key=www.huweiqi.top-key.pem
持久数据卷
PersistentVolume(PV):持久数据卷,对存储资源的抽象,使得存储作为集群中的资源管理。
• PersistentVolumeClaim(PVC):持久数据卷申请,用户定义使用的存储容量,使得用户不需要关心后端存储实现。
Pod申请PVC作为卷来使用,Kubernetes通过PVC查找绑定的PV,并挂载到Pod中供程序使PersistentVolume(PV):持久数据卷,对存储资源的抽象,使得存储作为集群中的资源管理。
• PersistentVolumeClaim(PVC):持久数据卷申请,用户定义使用的存储容量,使得用户不需要关心后端存储实现。
Pod申请PVC作为卷来使用,Kubernetes通过PVC查找绑定的PV,并挂载到Pod中供程序使
为什么引用
创建pv
[root@k8s-m2022-02 voluem]# cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/nfs
server: k8s-node2
pvc 使用
cat pvs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: pvc-web
name: pvc-web
spec:
replicas: 3
selector:
matchLabels:
app: pvc-web
strategy: {}
template:
metadata:
labels:
app: pvc-web
spec:
containers:
- image: nginx
name: nginx
resources: {}
volumeMounts:
- name: my-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: my-pvc
persistentVolumeClaim:
claimName: my-pvc
---
#pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
helm
helm
helm package /mnt/helm/my-chart/
helm install web2 -f update.yaml my-chart-0.1.0.tgz
helm upgrade web3 --set image.tag="1.17" my-chart-0.1.0.tgz
回滚
历史版本 [root@k8s-m2022-02 my-chart]# helm history web3
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Feb 21 19:27:51 2022 superseded my-chart-0.1.0 1.16.0 Install complete
2 Mon Feb 21 19:36:03 2022 superseded my-chart-0.1.0 1.16.0 Upgrade complete
3 Mon Feb 21 20:14:32 2022 deployed my-chart-0.1.0 1.16.0 Upgrade complete
[root@k8s-m2022-02 my-chart]# helm rollback web3
Rollback was a success! Happy Helming! 回滚到上一个版本
[root@k8s-m2022-02 my-chart]# helm history web3
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Mon Feb 21 19:27:51 2022 superseded my-chart-0.1.0 1.16.0 Install complete
2 Mon Feb 21 19:36:03 2022 superseded my-chart-0.1.0 1.16.0 Upgrade complete
3 Mon Feb 21 20:14:32 2022 superseded my-chart-0.1.0 1.16.0 Upgrade complete
4 Mon Feb 21 20:30:26 2022 deployed my-chart-0.1.0 1.16.0 Rollback to 2 回滚到2
helm rollback web3 1 指定版本号回滚
卸载
helm uninstall web1
运维篇
持续集成
自动化的进线 自动构建部署-发布