Kubernetes(K8S)
前置知识
- Linux操作系统
- Docker
第一部分
- k8s概念和架构
第二部分
- 从零搭建k8s集群
- 基于客户端的工具kubeadm(k5m)
- 基于二级制包方式
第三部分 k8s核心概念
- Pod
- Controller
- Service Ingress
- RABC
- Helm工具等
第四部分 搭建集群监控系统
第五部分 从零搭建高可用k8s集群
第六部分 在集群环境部署项目
第一部分
1、K8S基本概述和特性
2、K8S架构的组件
3、K8S核心概念
- Pod
- Controller
- Service
1、K8S概述
- K8S是谷歌2014年容器化集群管理系统
- 使用K8S进行容器化应用部署
- 使用K8S利于应用扩展
- K8S目标实施让容器化应用更加简洁和高效
2、K8S的特性
- 自动装箱
- 自我修复(自愈能力)
- 水平扩展
- 服务发现
- 滚动更新
- 版本退回
- 秘钥和配置管理
- 存储编排
- 批处理
3、K8S集群架构组件
Master(主控节点)和node(工作节点)
- master组件
- apiserver
- 集群统一入口以restful方式,交个etcd存储
- scheduler
- 节点调度,选择node节点引用部署
- controller-manager
- 处理集群中常规后台任务,一个资源对应一个控制器
- etcd
- 存储系统,用于保存集群相关的数据
- apiserver
- node节点组件
- kubelet
- master派到node节点代表,管理本机容器
- kube-proxy
- 提供网络代理,负载均衡等操作
- kubelet
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vskIjzEc-1689748920563)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507180216785.png)]
K8S核心概念
- Pod
- 最小部署单元
- 一组容器的集合
- 共享网络(这一组容器,共享网络)
- 生命周期是短暂的
- Controller
- 确保预期的pod副本数量
- 无状态应用部署
- 有状态应用部署
- 确保所有的node运行同一个pod
- 一次性任务和定时任务
- service
- 定义一组pod的访问规则
第二部分、搭建K8S集群
-
搭建k8s环境平台规划
-
平台规划
- 单master集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5wLLA0Qv-1689748920564)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507181527914.png)]
- 多master集群
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBeOurIU-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507181921558.png)]
-
-
服务器硬件配置要求
-
测试环境
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSKKf4zG-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220507182336686.png)]
-
-
搭建k8s集群部署方式
- kubeadm
- 官网
- k8s-master:192.168.118.100
- k8s-node1:192.168.118.101
- k8s-node2:192.168.118.102
- 二进制包
- kubeadm
一、使用kubeadm方式搭建k8s集群
1、安装三台虚拟机。安装操作系统centos7
2、对三个安装之后的操作系统进行初始化操作
-
关闭防火墙
-
systemctl stop firewalld systemctl disable firewalld systemctl status firewalld systemctl start firewalld
-
-
关闭selinux
-
sed -i 's/enforing/disabled/' /etc/selinux/config #永久 setenforce 0 #临时
-
-
关闭swap
-
swapoff -a #临时 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久 #========================== vim /etc/fstab # /dev/mapper/centos-swap swap swap defaults 0 0
-
-
根据规划修改主机名
-
#给主机命名 hostnamectl set-hostname <hostname> 192.168.118.100 k8s-master 192.168.118.101 k8s-node1 192.168.118.102 k8s-node2 #192.168.118.103 paddy3 #192.168.118.104 paddy4 # 新增域名解析 199.232.28.133 raw.githubusercontent.com 199.232.68.133 user-images.githubusercontent.com 199.232.68.133 avatars2.githubusercontent.com 199.232.68.133 avatars1.githubusercontent.com
-
配置主机网络
-
TYPE="Ethernet" PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="3d366597-c034-46a5-aec9-71c8310423da" DEVICE="ens33" ONBOOT="yes" ZONE=public #ip地址 IPADDR=192.168.118.100 #网关 GATEWAY=192.168.118.2 #域名解析器 DNS1=192.168.118.2
-
-
在master中修改hosts文件
-
将桥接的IPv4流量传递到iptables的链
-
#cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf #br_netfilter #EOF cat > /etc/sysctl.d/k8s.cfg << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #生效 # cat > /etc/sysctl.d/k8s.cfg << EOF # net.bridge.bridge-nf-call-ip6tables = 1 # net.bridge.bridge-nf-call-iptables = 1 # EOF
-
-
时间同步
-
yum install ntpdate -y ntpdate time.windows.com ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
-
3、所有节点安装docker/kubeadm/kubelet
-
卸载旧版本docker
-
yum remove docker-ce docker-ce-cli containerd
-
-
安装docker,配置docker的源
-
$ yum -y install wget $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo $ yum -y install docker-ce-18.06.1.ce-3.el7 $ systemctl enable docker && systemctl start docker $ docker --version
$ cat > /etc/docker/daemon.json << EOF { "registry-mirrors":[ "https://b9pmyelo.mirrors.aliyun.com"] } EOF systemctl restart docker #更换docker下载源地址: vi /etc/docker/daemon.json { "registry-mirrors" : [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "https://cr.console.aliyun.com/", "https://registry.hub.docker.com" ] }
-
-
添加阿里云YUN软件源
-
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
-
4、安装kubeadm、kubelet、lubectl
-
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 systemctl enable kubelet ###################### systemctl start kubelet systemctl status kubelet #查看kubelet状态 #卸载 yum remove -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
5、部署Kubernets Master
-
在master执行
-
#--service-cidr=10.96.0.0/12 地址随机设置,不冲突就可以 #--pod-network-cidr=10.244.0.0/16 #========================================= $ kubeadm init --kubernetes-version=1.18.0 --apiserver-advertise-address=192.168.253.100 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16 #=============================== kubeadm init --apiserver-advertise-address=192.168.118.100 --image-repository resgistry.aliyuncs.com/google_containers --kubernetes-version=v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
-
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9es3AP0K-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508102805130.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14hUoley-1689748920565)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508103028962.png)]
-
默认的拉去镜像地址k8s.gcr.io国内无法访问,指定使用阿里云镜像仓库
-
配置环境变量
-
vim /etc/profile # 在结尾加上 export KUBECONFIG=/etc/kubernetes/admin.conf # 更新配置 source /etc/profile
-
-
使用kubectl工具
mkdir -p $home/.kube sudo cp -i /etc/kubernetes/admin.conf $home/.kube/config sudo chown $(id -u):$(id -g) $home/.kube/config kubectl get nodes
#在Master节点获取join命令参数
kubeadm join 192.168.253.100:6443 --token 7onus4.n71s6zdr3s5h2mpi --discovery-token-ca-cert-hash sha256:bc3015592b803c63dabfb83a0f1a3176107262ec2f049629f8fe26ee3878bc6b
#解决问题
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
-
在node中执行jion命令
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BwFqeW0S-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508105500439.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7CaoaYVm-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508111214858.png)]
-
删除节点及配置文件
-
# 不可调度 kubectl cordon k8s-node2 # 可调度 kubectl uncordon k8s-node2 # 驱逐节点 kubectl drain k8s-node3 --delete-local-data --force --ignore-daemonsets # 删除节点 kubectl delete node k8s-node2 systemctl stop kubelet systemctl disable kubelet
-
-
当删除托管容器时 kubeadm 阻塞
-
一个可行的解决方案是重新启动 Docker 服务,然后重新运行
kubeadm reset
: -
sudo systemctl restart docker.service sudo kubeadm reset
-
6、部署CNI网络插件
-
#网络组件 wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 默认镜像地址无法访问,sed命令修改为docker hub镜像仓库
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml
kubectl get pods -n kube-system
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8hu0L1t-1689748920566)(D:\software\Typora-WorkPlace\typora-user-images\image-20220508182019373.png)]
-
无法访问地址解决方法
-
vi /etc/hosts ###增加下面的解析 199.232.68.133 raw.githubusercontent.com 199.232.68.133 user-images.githubusercontent.com 199.232.68.133 avatars2.githubusercontent.com 199.232.68.133 avatars1.githubusercontent.com
7、测试kubernetes集群
-
在kubernetes集群中创建一个pod,验证是否正常运行
-
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
访问地址:http://NodeIP:port
http://192.168.253.101:31774
8、安装总结:
使用kubeadmin方式搭建k8s集群
- 安装三台虚拟机,安装操作系统CentOS7
- 对三个安装之后操作系统进行初始化操作
- 在三个节点安装docker、kubelet、kubeadm、kubectl
- 在master节点执行kubeadm init命令进行初始化
- 在node节点上执行kubeadmin join命令把node节点添加到当前集群里面
- 配置网络插件
二、kubernetes集群搭建(二进制方式)
1、安装要求:
在开始之前部署Kubernetes集群集群需要满足以下几个条件
- 一台或多台机器。操作系统CentOS7
- 硬件配置,2G,2CPU,硬盘最低30G
- 集群所有机器之间网络互通
- 可以访问万网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 机制swap分区
2、准备环境
- 软件环境虚拟机
# 虚拟机环境
192.168.118.103 m1
192.168.118.104 n1
-
操作系统初始化(和kubeadm一下)
-
为etcd和apiserver自签证书
- 集群内部证书
- 外部访问需要证书
-
部署etcd集群
-
部署master组件
- kube-apiserver,kube-controller-manager,kube-scheduler,docker,etcd
-
部署node组件
- kubelet,kube-proxy,docker,etcd
-
部署集群网络
3、生成SSL证书
- 下载地址
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64
chmod +x cfssljson_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
cat << EOF | tee ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat << EOF | tee ca-csr.json
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cat << EOF | tee server-csr.json
{
"CN": "etcd",
"hosts": [
"192.168.118.103",
"192.168.118.104"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
cat << EOF | tee ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat << EOF | tee ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Shenzhen",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cat << EOF | tee server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.118.103",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Shenzhen",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
cat << EOF | tee kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Shenzhen",
"ST": "Shenzhen",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FQjjiRDp8IKGT+UDM+GbQLBzF3DqDJ+pKnMIcHGyO/o root@qas-k8s-master01
The key's randomart image is:
+---[RSA 2048]----+
|o.==o o. .. |
|ooB+o+ o. . |
|B++@o o . |
|=X**o . |
|o=O. . S |
|..+ |
|oo . |
|* . |
|o+E |
+----[SHA256]-----+
# ssh-copy-id 192.168.118.104
4、部署ETCD
- 下载安装文件
wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
- 解压安装文件
tar -xvf etcd-v3.3.10-linux-amd64.tar.gz
cd etcd-v3.3.10-linux-amd64/
cp etcd etcdctl /root/etcd/bin/
- etcd.conf文件编写
vim /opt/etcd/cfg/etcd.conf
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.118.103:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.118.103:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.118.103:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.118.103:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.118.103:2380,etcd02=https://192.168.118.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
vim /root/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/opt/etcd/cfg/etcd.conf
ExecStart=/opt/etcd/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-cluster-state=new \
--cert-file=/opt/etcd/ssl/server.pem \
--key-file=/opt/etcd/ssl/server-key.pem \
--peer-cert-file=/opt/etcd/ssl/server.pem \
--peer-key-file=/opt/etcd/ssl/server-key.pem \
--trusted-ca-file=/opt/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
- 配置文件复制到其他节点
#/root/etcd 复制到/opt/etcd/
cp -r /root/etcd /opt/etcd/
scp -r etcd root@192.168.118.104:/opt/
- 启动ETCD并设置开机启动
systemctl daemon-reload
systemctl start etcd
systemctl enable etcd
三、kubernetes集群命令行工具kubectl
1、kubectl概述
kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
2、kubectl命令的语法:
kubectl [command] [TYPE] [NAME] [flags]
command:指定要对资源执行的操作,create、get、describe和delete
TYPE:指定资源类型,资源类型是大小写敏感的,开发者可能够以单数、复数、和缩写的形式。例如
kubectl get pod/nginx-f89759699-bb8jp
kubectl get pods/nginx-f89759699-bb8jp
kubectl get po/nginx-f89759699-bb8jp
NMAE:资源名称
flags:指定可选的承诺书。例如,-s或者-server参数指定kubernetes API server的地址和端口
3、kubectl --help获取更多信息
kubectl --help
kubectl get --help
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
kubectl get cs
kubectl apply -f
四、YAML文件
资源文件清单
资源编排
1、语法格式
- 通过缩进表示层级关系
- 不能使用tab键缩进,只能用空格缩进
- 一般开头缩进两个空格
- 字符后缩进一个空格,比如冒号,逗号等之后
- 使用—三个横杠表示新的yaml文件的开始
- 使用#表示注释
2、yaml文件组成部分
- 控制器定义
- 被控制对象
#控制器定义:
apiVersion:API版本
kind:资源类型
metadata:资源元数据
spec:资源规格
replicas:副本数量
selector:标签选择器
template:Pod模板
metadata:Pod元数据
spec:Pod规格
containers:容器配置
#被控制的对象:
3、常用字段含义
4、如何快速编写YAML文件
- 第一种 使用kubectl create命令生成yaml文件
kubectl create deployment web --image=nginx -o yaml --dry-run > my1.yaml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQCfa4px-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517144246539.png)]
- 第二种 使用kubectl get 命令导出yaml文件
kubectl get deploy
kubectl get deploy nginx -o=yaml --export > my2.yaml
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuD1ZqvQ-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517144554902.png)]
五、kubernetes核心技术-Pod
1、Pod概述
- Pod是k8s系统中可以创建和管理的最小单元(最小的部署单元)
- Pod是由一个或者多个container组成的(一组容器的集合)
- 一个Pod中的容器共享网络命名空间
- Pod是短暂的
2、Pod存在的意义
- 创建容器使用docker,一个docker对应是一个容器,一个容器有进程,一个容器运行一个应用程序
- Pod是一个多进程设计,运行多个应用程序
- 一个pod有多个容器,一个容器里面运行一个应用程序
- Pod存在为了亲密性应用
- 两个应用之间进行交互
- 网络之间的调用
- 两个应用需要频繁调用
3、Pod的实现机制
-
共享网络机制
- 容器之间相互隔离的
- namespace
- group
- 前提条件
- 容器在同一个ns(namespace)里面
- pod实现共享网络机制(IP MAC PORT)
- 首先创建pause info容器
- 业务容器1 加入info容器
- 业务容器2 加入info容器
- 共享网络:通过Pause容器,把其他业务容器加入到Pause容器里面,让所有业务容器在同一个名称空间(namespace)中,可以实现网络共享
- 容器之间相互隔离的
-
共享存储机制
- Volumn数据卷(持久化存储)
- Pod持久化数据
- 日志数据
- 业务数据
- 共享存储:引入数据卷概念Volumn,使用数据卷进行持久化存储
-
Pod镜像拉取策略
- IfNotPresent:默认值,镜像在宿主机上不存在是才拉取
- Always:每次创建Pod都会重新拉取一次镜像
- never:Pod永远不会主动拉取这个镜像
-
Pod资源限制
- requests:调度限制
- limits:最大
-
Pod重启机制
- Always:当容器终止退出后,总是重启容器,默认策略
- OnFailure: 当容器异常退出(退出代码非0)时,才重启容器
- Never:当容器终止退出,从不重启容器
-
Pod健康检查
- 容器检查,
- java对内存溢出,无法通过检查容器发现
- 应用层面监控检查
- livenessProbe(存活检查)
- 如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
- readinessProbe(就绪检查)
- 如果检查失败,kubernetes会把Pod从service endpoints中提出
- Prode支持以下三种检查方法
- httpGet
- 发送HTTP请求,返回200-400范围状态码为成功。
- exec
- 执行shell命令返回状态码是0为成功
- tcpSocket
- 发起TCP Socket建立成功
- httpGet
- 容器检查,
4、Pod(调度策略)
1、创建Pod流程
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-f89759699-bb8jp 1/1 Running 3 8d 10.122.1.6 k8s-node1 <none> <none>
mater节点:
-
create — apiserver — etcd
-
schduler — apiserver — etcd — 调度算法,把pod调度到某个节点上
node节点:
- kubelet — apiserver — 读取etcd拿到分配给当前节点pod — docker创建容器
2、影响Pod调度(资源限制和节点选择器)
- pod资源限制对pod调度产生影响
- 根据request找到足够node节点进行调度
- 节点选择器标签调度
- 首先对节点创建标签
nodeSelector:
env_role: dev
#给node打标签
kubectl label node k8s-node1 env_role=prod
#查看标签
kubectl get nodes k8s-node1 --show-labels
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ELXQOU7y-1689748920567)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517170108065.png)]
-
节点的亲和性
-
nodeAffinitty和之前nodeSelector基本一样的,根据节点上标签约束来决定Pod调度到那些节点上。
-
应亲和性
- 约束条件必须满足
-
软亲和性
- 尝试满足,不满足
-
支持常用操作符:
- In NotIn Exist Gt Lt DoseNotExists
-
-
-
反亲和性
-
污点
-
基本介绍
- nodeSelector和nodeAffinity:Pod调度到某些节点上,Pod里面属性,调度时实现
- Taint污点:节点不做普通分配调度,是节点属性,
-
应用的场景
- 专用节点
- 配置特点硬件节点
- 基于Taint驱逐
-
具体演示
-
查看节点污点情况
-
kubectl describe node k8s-master | grep Taint Taints: node-role.kubernetes.io/master:NoSchedule
- 污点值:
- NoSchedule:节点一定不被调度
- PreferNoSchedule:尽量不被调度
- NoExecute:不会调度,并且还会驱逐Node已有Pod
- 污点值:
-
为节点添加污点
-
#语法 kubectl taint node [node] key=value:污点三个值 #为node添加污点 kubectl taint node k8s-node1 env_role=yes:NoSchedule #查看污点 kubectl describe node k8s-node1 | grep Taint #创建pod kubectl create deployment web --image=nginx #生成多个pod kubectl scale deployment web --replicas=5 #查看pod分布情况,污点效果,都分配到其他node kubectl get pods -o wide
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4AHCiWjl-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517173945758.png)]
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FUNm2lTH-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517173339497.png)]
-
删除污点
-
#查看污点 kubectl describe node k8s-node1 | grep Taint Taints: env_role=yes:NoSchedule #删除污点 kubectl taint node k8s-node1 env_role:NoSchedule- node/k8s-node1 untainted #查看污点是否删除 kubectl describe node k8s-node1 | grep Taint Taints: <none>
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L3OPQIRB-1689748920568)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517174607851.png)]
-
-
-
污点容忍
-
spec: tolerations: - key: "key" operator: "Equal" value: "value" effact: "NoSchedule"
-
六、kubernetes核心技术-Controller(Deployment)
1、什么是controller
2、Pod和controller关系
3、Deployment控制器应用场景
4、yaml文件字段说明
5、Deployment控制器部署应用
6、Deployment升级回滚
7、弹性伸缩
1、什么是Controller
- 在集群上管理和运行容器的对象
2、Pod和Controller关系
- Pod是通过controller实现应用的运维,比如伸缩,滚动升级等等
- PodheController之间通过label标签建立关系
- 控制器(工作负载)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CV6Lph2p-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517183311842.png)]
3、Deployment应用场景
- deployment部署无状态应用
- 管理Pod和ReplicaSet(副本创建)
- 部署,滚动升级等功能
- 应用场景:web服务,微服务
4、使用deployment部署应用(yaml)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DyZXtfap-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190542833.png)]
- 导出yaml文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U90CbbKP-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190711796.png)]
- 使用yaml文件部署应用,并查看部署是否成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yKvsY8ek-1689748920569)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517190808846.png)]
- 对外发布(暴露对外端口号)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kF9DY1LK-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517191934669.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fn55ObeX-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517192035088.png)]
5、升级回滚和弹性伸缩
- 应用升级命令
kubectl set image deployment web nginx=nginx:1.15
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7qS1dFr-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517192841903.png)]
- 查看升级状态
#升级状态
kubectl rollout status deployment web
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yhnnTjVH-1689748920570)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193310302.png)]
- 应用回滚
- 查看历史版本
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKphh7LV-1689748920571)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193508289.png)]
- 回滚到上一个版本
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jmEGiZ2h-1689748920571)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517193739541.png)]
- 回滚到指定版本
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OKwbXmPA-1689748920572)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517194038585.png)]
- 弹性伸缩(提供更多的服务)
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bEral6b-1689748920572)(D:\software\Typora-WorkPlace\typora-user-images\image-20220517194345353.png)]
#应用回滚
#查看历史版本
kubectl rollout history deployment web
#回滚到上一个版本
kubectl rollout undo deployment web
#回滚到指定版本
kubectl rollout undo deployment web --to-revision=1
#弹性伸缩(提供更多的服务)
kubectl scale deployment web --replicas=10
七、kubernetes核心概念-Service
1、service存在的意义
- 防止Pod失联(服务发现)
- 定义一组Pod访问策略(负载均衡)
2、Pod和service关系
- 根据label和selector标签建立关联
- 通过service实现Pod的负载均衡
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2C6X78M9-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518174536963.png)]
3、常用的service类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlOhHv8a-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518175014977.png)]
- ClusterIP:集群内部使用
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-187owZ7r-1689748920573)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181039831.png)]
- NodePort:对外访问应用使用暴露端口
- 修改service.yaml配置文件
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCW9DJVs-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181350988.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqy5pDiv-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518181303145.png)]
- LoadBalancer:对外访问应用使用,公有云
node内网部署应用,外网一般不能访问到
- 找到一台可以进行外网访问机器,安装nginx,反向代理。
- 手动把可以访问节点添加到nginx里面
- LoadBalancer:公有云,负载均衡控制器
八、kubernetes核心概念-Controller
1、无状态和有状态的区别
- 无状态
- 认为Pod都是一样的
- 没有顺序的要求
- 不用考虑在哪个node上运行,
- 随意进行伸缩扩展
- 有状态
- 上面因素都需要考虑到
- 让每个Pod都是独立的,保持pod启动顺序和唯一性
- 唯一的网络标识符,持久存储
- **有序,比如mysql主从
2、部署有状态的应用
-
无头service
- ClusterIP: none IP为空
-
StatefulSet部署有状态应用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hV3dN6bg-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518183716332.png)]
有状态配置文件
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: default
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
- 根据配置文件部署应用
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbLCPc2z-1689748920574)(D:\software\Typora-WorkPlace\typora-user-images\image-20220518184953127.png)]
- 查看无头的service
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eksfN6vc-1689748920575)(D:\software\Typora-WorkPlace\typora-user-images\image-20220625162306747.png)]
- deployment和statfulset的区别:有身份的(唯一标识)
- 根据主机名+按照一定的规则生成域名
- 每一个pod有唯一域名
- 唯一域名
- 格式:主机名称.service名称.名称空间.svc.cluster.local
- nginx-statefulset-0.nginx.default.svc.cluster.local
- 根据主机名+按照一定的规则生成域名
3、部署守护进程
-
在每个node中运行一个pod,新加入的node也同样运行在一个pod里面
-
例子:在每个node节点安装数据采集工具
-
ClusterIP: none IP为空
-
-
StatefulSet部署有状态应用
[外链图片转存中…(img-hV3dN6bg-1689748920574)]
有状态配置文件
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: default
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
- 根据配置文件部署应用
- [外链图片转存中…(img-zbLCPc2z-1689748920574)]
- 查看无头的service
- [外链图片转存中…(img-eksfN6vc-1689748920575)]
- deployment和statfulset的区别:有身份的(唯一标识)
- 根据主机名+按照一定的规则生成域名
- 每一个pod有唯一域名
- 唯一域名
- 格式:主机名称.service名称.名称空间.svc.cluster.local
- nginx-statefulset-0.nginx.default.svc.cluster.local
- 根据主机名+按照一定的规则生成域名
3、部署守护进程
- 在每个node中运行一个pod,新加入的node也同样运行在一个pod里面
- 例子:在每个node节点安装数据采集工具