kubernetes

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后登陆


在这里插入图片描述
vim recommended.yaml

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等命令了

  1. 先创建一个pod
kubectl create  deploy pod-name --image=ngixn
  1. 创建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

运维篇

持续集成

自动化的进线 自动构建部署-发布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值