一.:K8s 概念 & 架构组件(1~4)
1:课程介绍:
2:K8s 概述 :
1)K8s 概述:
-1:K8s 由 Google 在2014年,开源的容器化集群管理系统。
-2:使用 K8s,进行容器化应用部署。
-3:使用 K8s 利于应用拓展。
-4:K8s 目标实施,让部署容器化应用,更加简洁和高效。
3:K8s 特性(优势):
1)概述:
2)K8s 功能(优势):
-1:自动装箱:基于容器,对应用运行环境的资源配置要求自动部署应用容器。
-2:自我修复(自愈能力)
a:当容器失败时,会对容器进行重启。
b:当所部署的 Node 节点有问题时,会对容器进行重新部署 和 重新调度。
c:当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务。
-3:水平扩展:通过简单的命令、用户UI界面 或 基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁。
-4:服务发现:用户不需要使用,额外的服务发现机制,就能够基于 Kubernetes 自身能力,实现服务和负载均衡。
-5:滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
-6:版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时会退。
-7:密钥 和 配置管理:在不需要,重新构建镜像的情况下,可以部署、更新密钥、应用配置。蕾丝热部署。
-8:存储编排:自动实现存储系统挂载及应用,特别对有状态应用,实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务。
-9:批处理:提供一次性服务,定时任务;满足批量数据处理和分析的场景。
4:K8s 集群架构的组件:
1)Master node:
(集群控制节点,对集群进行调度管理,接收集群外用户对集群的请求操作)
-1:API Server:集群统一的入口,以 Restful 风格进行操作,并交给 etcd 存储。
-2:Scheduler:节点调度,选择 worker node 节点应用部署。
-3:Controller-manager:处理集群中,常规的后台的任务。一个资源,对应一个控制器。
-4:etcd:存储系统,用于保存集群中相关的数据。
2)Worker node:
(集群工作节点,运行用户业务应用容器)
-1:Kubelet:master 派到 worker node 节点的代表,管理本机容器的部分。
-2:kube-proxy:提供网络代理,可以实现负载均衡等操作。
5:K8s 核心概念:
1)Pod:
-1:最小部署单元
-2:一组容器的集合
-3:容器间 共享网络的
-4:生命周期是短暂的
2)Controller:
-1:确保预期的 pod 副本数量
-2:无状态 应用部署
-3:有状态 应用部署:(依赖存储、网络IP唯一)
-4:确保所有的 node 都运行同一个 pod
-5:一次性任务 和 定时任务
3)Service:
-1:定义一组 pod 的访问规则。(访问入口)
4)总体过程:通过 Service 统一入口进行访问,由 controller 创建 pod ,进行部署。
二.:搭建 K8s 集群(2种方式)(5~18)
1:搭建 K8s 环境平台规划:
1)单 master 集群:
2)多 master 集群:
2:服务器硬件配置要求:
1)测试环境:
-1:master:2核、4G、20G
-2:node:4核、8G、40G
2)生产环境:
-1:master:8核、16G、100G
-2:node:16核、64G、500G
3:方式一:基于客户端工具(kubeadm):
1)介绍:
-1:Kubeadm:是官方社区,推出的一个用于快速部署 Kubernetes 集群的工具,这个工具能通过 2条指令,完成一个 Kubernetes 集群的部署。
-2:Kubeadm:是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join。
-3:用于快速部署 Kubernetes 集群。
2)Kubeadm 部署方式介绍:
-1:创建一个 Master 节点:
kubeadm init
-2:将一个 Node 节点,加入到当前集群中:
kubeadm join <Master节点的 IP + 端口>
3)安装要求:
4)最终目标:
-1:在所有节点上,安装 Docker 和 kubeadm
-2:部署 Kubernetes Master
-3:部署容器网络插件
-4:部署 Kubernetes Node,将节点介入 Kubernetes 集群中
-5:部署 Dashboard Web 页面,可视化查看 Kubernetes 资源
5)准备环境:
6)系统初始化:(启动 3台主机)
-1:关闭 防火墙:
systemctl stop firewalld -- 临时关闭防火墙
systemctl disable firewalld -- 永久关闭防火墙
-2:关闭 selinux:
setenforce 0 -- 临时关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config -- 永久关闭
cat /etc/selinux/config -- 查看: SELINUX=disabled
-3:关闭 swap:(关闭内存交换)
swapoff -a --临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab -- 永久关闭
free -g -- 验证,swap 必须为:0
-4:根据规划,设置主机名称:
hostnamectl set-hostname <newhostname>:指定新的 hostname
vim /etc/hostname
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
-5:在 master 添加 hosts:(只有 master 执行)
cat >> /etc/hosts << EOF
192.168.124.11 k8s-master
192.168.124.12 k8s-node1
192.168.124.23 k8s-node2
EOF
-6:将 桥接的 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 --生效
-7:时间同步:
date -- 查看时间
yum install -y ntpdate
ntpdate time.windows.com -- 同步最新时间
-8:疑难问题:遇见提示是:只读的文件系统,运行命令如下:
mount -o remount rw /
-9:需要重启:
7)所有节点安装 Docker / Kubeadm / Kubelet :
Kubernetes:默认 CRI(容器运行时)为 Docker,因此先安装Docker
-1:安装 Docker:(见 阳哥 笔记)
-2:添加 阿里云 YUM 软件源:
vim /etc/yum.repos.d/kubernetes.repo
[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
-3:安装 kubeadm、kubelet、kubectl:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
yum list|grep kube -- 查看是否存在
systemctl start kubelet -- 启动
systemctl enable kubelet -- 开机启动
8)部署 Kubernetes Master:
-1:在 Master 执行:(最后2个IP没什么特别要求,只要和上面不冲突即可)
kubeadm init \
--apiserver-advertise-address=192.168.124.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
-a:由于 默认拉取镜像地址 K8s.gcr.io,国内无法访问,这里指定阿里云镜像仓库地址。
-b:service-cidr:service 网络地址。
-c:pod-network-cidr:pod 网络地址。
-d:cidr:
-2:在 Master 执行:(执行成功后的提示,粘贴执行)
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
9)加入 Kubernetes Node:
-2:在 node1 & node2 上执行:
(向集群中添加新节点,执行在 Kubeadm init 输出的 kubeadm join 命令)
kubeadm join 192.168.124.11:6443 --token sbzkvd.w1xslo09xj8fyhvs \
--discovery-token-ca-cert-hash sha256:2b1f98aac375fe2a595d228e056f1f34dd4471455ac27e7d361001a5488dadb8
-3:默认 token 有效期 为:24h,重新创建 token 操作:(在 Master 操作)
kubeadm token create --print-join-command -- 24h过期的token
kubeadm token create --ttl() --print-join-command -- 不过期的token
-4:master 执行:(未准备就绪的状态)
10)部署 CNI 网络插件:(Master 执行 )
-1:wget: (无需执行)
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-2:默认镜像地址无法访问,sed命令修改为:docker hub 镜像仓库。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
-- 安装
kubectl delete -f xxx
-- 删除
-3:查看:(网络需要等待)
kubectl get nodes //--获取 K8s集群中,所有节点
kubectl get ns //--获取全部,名称空间
kubectl get pods / kubectl get pod //-- 获取 默认名称空间的;部署的 pod 信息(最小单元)
kubectl get pods -o wide //--可以获取到 Nginx 信息(完整信息)
kubectl get pods -n kube-system //-- 查看指定名称空间的 pods
kubectl get pods --all-namespaces //-- 获取所有名称空间的 pods
watch kubectl get pods -n kube-system -o wide //-- 监控 pod 速度
11)测试 Kubernetes 集群:(部署 Tomcat)
-1:在 Kubenetes 集群中,创建一个 Pod,验证是否正常运行:
kubectl create deployment my_nginx --image=nginx
-- 联网拉取 Nginx 镜像
kubectl get all
kubectl get all -o wide
-- 获取 K8s 里,所有资源
kubectl expose deployment nginx --port=80 --type=NodePort
-- 对外暴露端口,外界可以访问它(使用节点端口模式)
kubectl get pod,svc -o wide
-- 查看当前对外端口
-2:访问:
(访问任意一个节点:ip:31565,可以访问 Nginx)
(说明集群状态成功)
-3:动态扩容:???
kubectl get deployment
kubectl set image(--help 查看帮助)
kubectl scale --replicas=3 deployment nginx
-- 扩容:
-4:删除:
流程:创建 deployment 会管理 replicas,replicas 控制 pod 数量,有 pod 故障,会自动拉起新的 pod。
kubectl get all
kubectl delete deploy/nginx
kubectl delete deployment.apps/tomcat6
4:方式二:基于 二进制包 方式:
1)介绍:
-1:从 Github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
-2:Kubeadm 降低部署门槛,但是屏蔽了很多细节,遇到问题很难排查。
-3:如果想集群更容易可控,推荐使用 二进制包,部署 Kubernetes 集群。
-4:虽然手动部署麻烦点,但期间可以学习很多工作原理,也利于后期维护。
2)安装要求:
3)搭建方式:
4)环境准备:(同上: 6)系统初始化)
5)部署 etcd 集群:
6)安装 Docker:
7)部署 Master Node:
8)部署 Worker Node:
9)部署 DashBoard 和 Controller:
5:两种方式总结:
1)kubeadm:
2)二进制包:
三.:K8s 核心技术 & 概念(19~21)
1:命令行工具:(kubectl)
官网介绍:https://kubernetes.io/zh/docs/reference/kubectl/overview/
1)kubectl 概述:(kube controller)
-1:kubectl 是 Kubenetes 集群的命令行工具。
-2:可以对集群本身进行管理。并能够在集群上,进行容器化应用的安装部署。
2)kube 命令的语法:
-1:command:
-2:TYPE:
-3:NAME:
-4:flags:
-5:命令总结:
3)Kubectl help 获取更多的信息:
kubectl --help
kubectl get --help
4)kubectl 子命令使用分类:
-1:
-2:
-3:
-4:
-5:
2:资源编排:(YML 文件详解)
1)YAML 文件概述:
2)YAML 文件书写格式:
-1:YAML 介绍:
-2:YAML 基本语法:
-3:组成部分:
-4:常用字段含义:
3)快速编写 YAML 文件:
-1:方式一:生成原始的 yaml 文件
kubectl create deployment web --image=nginx -o yaml --dry-run=client
-- 查看
kubectl create deployment web --image=nginx -o yaml --dry-run > aaa.yaml
--导出
-2:方式二:导出运行文件,再做修改。
[root@k8s-master ~]# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 26h
[root@k8s-master ~]# kubectl get deploy nginx -o=yaml --export > my2.yaml
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
四.:Pod 介绍(22~29)
1:基本介绍:
1)Pod 基本概念:
-1:最小的部署单元
-2:包含多个容器(一组容器的集合)
-3:一个 pod 中,容器共享网络命名空间
-4:pod 是短暂的(ip 不唯一)
2)Pod 存在意义:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
2:Pod 两种实现机制:
1)共享网络:
-1:通过 Pause 容器,把其他业务容器加入到 Pause 容器里面。
-2:让所有业务容器在同一个名称空间中,可以实现网络共享。
2)共享存储:
-1:引入了数据卷的概念,使用数据卷,进行持久化存储,可实现共享存储。
3:Pod(镜像拉取、重启策略、资源限制、健康检查):
1)镜像拉取:
-1:镜像拉取策略:
2)重启策略:
3)资源限制:本身由 docker 实现。
4)健康检查:
4:创建 Pod 流程:
1)流程图 :
5:Pod 调度策略:
1)影响调度的属性:(3)
2)污点 & 污点容忍:(反亲和性)
搭建 K8s 集群 监控平台 系统
从 0 开始,搭建高可用 K8s 集群
五.:Controller 介绍(30~32)
1:概述 & 应用场景:
1)什么是 Controller:
-1:在集群上,管理和运行容器的对象。
2)Pod 和 Controller 关系:
-1:Pod 通过 Controller 控制器,实现应用的运维操作。(伸缩、回滚、升级)
-2:他们之间,通过 label 标签 和 selector,建立关系。
3)Deployment 控制器应用场景:
-1:部署无状态应用。
-2:管理 Pod 和 ReplicaSet。
-3:(微服务中)上线部署、回滚升级等功能。
2:发布应用:
1)生成 yaml 文件,并查看:
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
2)执行此文件:
anaconda-ks.cfg initial-setup-ks.cfg web.yaml
[root@k8s-master ~]# kubectl apply -f web.yaml
deployment.apps/web created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-f89759699-7dpqd 1/1 Running 0 34h
web-5dcb957ccc-sjz2x 0/1 ContainerCreating 0 12s
3)对外发布(对外暴露端口):(8080)
kubectl expose deployment web --port=8080 --type=NodePort --target-port=8080 --name=tomcat4 -o yaml > tomcat4.yaml
-- 生成yaml 文件
[root@k8s-master ~]# kubectl apply -f tomcat4.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
service/tomcat4 configured
-- 发布
4)查看 & 访问:
[root@k8s-master ~]# kubectl get pods,svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/tomcat4 NodePort 10.103.182.128 <none> 8080:31789/TCP 4m52s
-1:访问:http://192.168.124.11:31789/
3:应用升级回滚 & 弹性伸缩:
六.:Service(33~34)
1:概述:
1)service 存在的意义:
2)Pod 和 Service 关系:
2:三种 常用类型:
七.:Controller(35~37)
1:无状态 & 有状态:
2:部署有状态应用:
3:部署守护进程:(DaemonSet)
4:一次性任务 & 定时任务:
1)一次性任务(job):
2)定时任务(cronjob):
八.:配置管理(38~39)
1:secret:
2:ConfigMap:
九.:集群安全机制(40~42)
1:概述:
2:鉴权(RBAC):
1)结构:
2)实现过程:
十.:核心技术—Ingress(43~44)
1:解释:
2:操作:
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
十一.:核心技术—Helm(45~51)
1::
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
十二.:核心技术—持久化存储(52~53)
1::
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
2::
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
十三.:集群搭建(54~60)
1::
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
2::
1):
-1:
-2:
-3:
-4:
-5:
2):
-1:
-2:
-3:
-4:
-5:
3):
-1:
-2:
-3:
-4:
-5:
4):
-1:
-2:
-3:
-4:
-5:
5):
-1:
-2:
-3:
-4:
-5:
十四.:K8s 集群项目部署(Java)(61~64)
1:容器交付流程:
1)总体流程:
2)细节流程:
2:制作镜像 & 推送到云:
1)项目打包:
2)制作镜像 & 测试运行:
-1:maven 打包项目:
-2:docker file:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD demo-hello.jar demo-hello.jar
ENTRYPOINT ["java","-jar","/demo-hello.jar","&"]
-3:build:
docker build -f Dockerfile -t demo-dockerfile-01:1.2 .
-4:运行:
docker run -d -p 8080:8080 --name aaaaadockerfile demo-dockerfile-01:1.2
-5:访问测试:
3)上传镜像,到云服务器中:
3:部署镜像 & 对外暴露镜像:
1)部署镜像:
-1:导出 yaml 文件:
kubectl create deployment javademo1 --image=registry.cn-beijing.aliyuncs.com/z-java-demo-01/z-java-demo-01-reposroty --dry-run -o yaml >java-demo1.yaml
-2:执行 yaml 文件:
[root@k8s-master dockerfile]# kubectl apply -f java-demo1.yaml
deployment.apps/javademo1 created
-3:查看:
[root@k8s-master dockerfile]# kubectl get pods
NAME READY STATUS RESTARTS AGE
javademo1-6d46f4d788-9p4ld 0/1 Running 0 2m15s
2)暴露端口:
kubectl expose deployment javademo1 --port=8080 --target-port=8080 --type=NodePort
-1:查看对外端口:
kubectl get pods,svc
3)总结: