K8S核心笔记

K8S安装部署

1.概述:

Kukernetes简称K8s。是用于自动部署,扩展和管理容器化应用程序的开源系统;分布式容器管理系统;

1).部署方式的进化:

在这里插入图片描述

传统部署时代:

​ 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源的分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每一个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本比较高;

虚拟化时代:

​ 作为解决方案,引入了虚拟化功能,它允许在单个服务器的CPU上运行多个虚拟机。虚拟化功能允许应用程序在VM之间隔离,并提供安全级别,并且可以轻松地添加或更新应用程序、降低硬件的成本,实现了更好的可伸缩性;但是虚拟机会带来许多资源的浪费,因为每一台虚拟机都会有一个操作系统;

容器化时代:

​ 容器类似于具有轻量级的隔离属性的VM,可以在应用程序之间共享操作系统。由此构成了松散耦合、分布式、弹性、解放的微服务;

2).功能

服务发现和负载均衡:

​ K8s可以使用DNS名称或自己的IP公开容器,当容器的流量大时,K8s可以负载均衡并分配网络流量,从而使部署稳定。(例如:现在B服务要调用A服务,可以利用K8s内存的DNS名称,找到所对应的服务器)
在这里插入图片描述
存储编排:

​ K8s允许自动挂载到选择的文件系统。例如本地存储、公共云提供商等。

自动部署和回滚:

​ 可以使用K8s描述已部署容器的所需状态,它可以以受控的状态更改为所需状态。(例如,您可以自动化K8s来部署创建新的容器,删除现有容器并将他们的所有资源用于新的容器)
在这里插入图片描述
自动打包:

​ K8s允许您指定每个容器所需CPU和内存。当容器指定了资源请求时,K8s可以做出更好的决策来管理容器的资源。

自我修复:

​ K8s重启失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
在这里插入图片描述
秘钥与配置管理:

​ K8s允许您存储和管理管理信息,例如密码、OAuth令牌和SSH秘钥。您可以在不重建容器镜像的情况下部署和更新秘钥和应用配置,也无需在堆栈配置中暴露秘钥。

2.主从架构在这里插入图片描述主从架构:

​ 一个Master管理多个Node,由Master调度我们所有节点,将应用部署到容器中。
Master:在这里插入图片描述
API Server:对外暴露K8s的Api接口,是外界进行资源操作的唯一入口;提供认证、授权、访问控制、API注册和发现等机制;

etcd: 是兼具一致性和高可用的键值对数据库,可以作为保存K8s所有集群数据的后台数据库;

Scheduler:监视新创建未指定运行节点的Pod,并选择节点让Pod在上面运行;

Controller:

​ 节点控制器:负责在节点出现故障时进行通知和响应;

​ 副本控制器:负责为系统中每个副本控制器对象维护正确数量的Pod;

​ 端点控制器:填充端点(EndPoints)对象(即加入Service、Pod);

​ 服务账户和令牌控制器(Service Account & Token Controller):为新的命名空间创建默认账户和API访问令牌;

Node: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZnJj8BV-1660713456144)(C:\Users\wzh\AppData\Roaming\Typora\typora-user-images\image-20220815125043564.png)]

​ Kubelet: 一个在集群中每个节点上运行的代理,负责维护容器的生命周期,它保证容器都运行在Pod中。

​ Kube-proxy:为Service提供cluster内部的服务发现和负载均衡;

​ fluentd: 一个守护进程,负责提供当前节点的日志收集;

3.工作原理


用户通过Kubectl或者UI页面进行操作,首先会通过API Server 进行认证,scheduler进行任务调度,Controller负责创建任务的资源。API Server 通知Kubelet去创建和管理容器。

​ Container: 容器,可以是docker启动的一个容器;

​ Pod: K8s使用Pod来组织一组容器;一个Pod中的所有容器共享同一网络;Pod是K8s中的最小部署单元;

​ Volume: 声明在Pod容器中可访问的文件目录,可以被挂载在Pod中一个或多个容器指定路径下;

​ Controller: 更高层次对象、部署和管理Pod;

​ Deployment:定义一组Pod的副本数量、版本等,控制版本;

​ Service: 定义一组Pod的访问策略,Pod的负载均衡,提供一个或多个Pod的稳定访问地址;

​ Label: 标签,用于对象资源的查询、筛选;

​ NameSpace: 命名空间,逻辑隔离;一个集群内部的逻辑隔离机制;每个资源都属于一个nameSpace;同一个nameSpace所有资源名不能重复;不同nameSpace 可以资源名重复;

流程叙述:
在这里插入图片描述1、通过 Kubectl 提交一个创建 RC(Replication Controller)的请求,该请求通过 APIServer被写入 etcd 中
2、此时 Controller Manager 通过 API Server 的监听资源变化的接口监听到此 RC 事件
3、分析之后,发现当前集群中还没有它所对应的 Pod 实例,
4、于是根据 RC 里的 Pod 模板定义生成一个 Pod 对象,通过 APIServer 写入 etcd
5、此事件被 Scheduler 发现,它立即执行一个复杂的调度流程,为这个新 Pod 选定一
个落户的 Node,然后通过 API Server 讲这一结果写入到 etcd 中,
6、目标 Node 上运行的 Kubelet 进程通过 APIServer 监测到这个“新生的”Pod,并按照它的定义,启动该 Pod 并任劳任怨地负责它的下半生,直到 Pod 的生命结束。
7、随后,我们通过 Kubectl 提交一个新的映射到该 Pod 的 Service 的创建请求
8、ControllerManager 通过 Label 标签查询到关联的 Pod 实例,然后生成 Service 的Endpoints 信息,并通过 APIServer 写入到 etcd 中,
9、接下来,所有 Node 上运行的 Proxy 进程通过 APIServer 查询并监听 Service 对象与其对应的 Endpoints 信息,建立一个软件方式的负载均衡器来实现 Service 访问到后端Pod 的流量转发功能。

4.集群安装:

1)前置环境:

​ 一台或多台机器,操作系统 CentOS7.x-86_x64;

​ 硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多;

​ 集群中所有机器之间网络互通;

​ 可以访问外网,需要拉取镜像;

​ 禁止 swap 分区;

2)部署步骤:

​ 1.在所有节点上安装 Docker 和 kubeadm

​ 2.部署 Kubernetes Master
​ 3.部署容器网络插件
​ 4.部署 Kubernetes Node,将节点加入 Kubernetes 集群中
​ 5.部署 Dashboard Web 页面,可视化查看 Kubernetes 资源在这里插入图片描述

3).环境设置:

获取默认网卡:

​ ip route show

获取ip地址 :

​ ip addr

​ 172.19.139.127

​ 172.19.139.125

​ 172.19.139.126

​ 相互ping一下;

关闭防火墙:

​ systemctl stop firewalld

​ systemctl disable firewalld

关闭 selinux(安全策略):

​ sed -i ‘s/enforcing/disabled/’ /etc/selinux/config

​ setenforce 0

关闭 swap(内存交换):

​ 临时关闭:swapoff -a

​ 永久关闭:sed -ri ‘s/.swap./#&/’ /etc/fstab

​ 验证,swap 必须为 0:free -g

添加主机名与IP映射:

​ vi /etc/hosts

​ 172.19.139.127 K8s-master

​ 172.19.139.125 k8s-salve-01

​ 172.19.139.126 k8s-salve-02

将桥接的 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

5.安装Docker:

1) 卸载之前安装的docker:

​ sudo yum remove docker \

​ docker-client \

​ docker-client-latest \

​ docker-common \

​ docker-latest \

​ docker-latest-logrotate \

​ docker-logrotate \

​ docker-engine

2)安装Docker-CE:

安装必须的依赖:

​ sudo yum install -y yum-utils \

​ device-mapper-persistent-data \

​ lvm2

设置 docker repo 的 yum 位置:

​ sudo yum-config-manager --add-repo \https://download.docker.com/linux/centos/docker-ce.repo

安装docker,以及docker客户端:

​ sudo yum install docker-ce docker-ce-cli containerd.io

配置docker镜像加速:

​ mkdir -p /etc/docker

​ tee /etc/docker/daemon.json <<-‘EOF’

​ {

​ “registry-mirrors”: [“https://87mcprgz.mirror.aliyuncs.com”]

​ }

​ EOF

​ systemctl daemon-reload --重启docker的后台线程

​ systemctl restart docker --重启docker的服务

设置docker开机自启:

​ sudo systemctl enable docker

6.设置阿里云yum源:

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

7.安装 kubeadm ,kubelet 和 和 kubectl

yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
--设置kubelet开机启动:
systemctl enable kubelet
--开启kubelet默认是起不来的,后面会处理
systemctl start kubelet

8.Master节点初始化:

1)拉取代码所需镜像:

 #!/bin/bash
images=(
	kube-apiserver:v1.17.3
    kube-proxy:v1.17.3
	kube-controller-manager:v1.17.3
	kube-scheduler:v1.17.3
	coredns:1.6.5
	etcd:3.4.3-0
    pause:3.1
)

for imageName in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
#   docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName  k8s.gcr.io/$imageName
done

2).kubeadm 初始化:

 kubeadm init \
--apiserver-advertise-address=172.19.139.127 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16

3).执行引导信息:

 kubeadm init \
--apiserver-advertise-address=172.19.139.127 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16

4).保存kubeadm token信息

kubeadm join 172.19.139.127:6443 --token hhegzh.uggnuqghirzomg3z \
    --discovery-token-ca-cert-hash sha256:787e5c54bf94938e0a57beaa5f092c2ca874df4a0d0cbff421a501e6d218de0c

9.安装POD网络插件(CNI)

上传本地文件kube-flannel.yml:

kubectl apply -f  kube-flannel.yml

查询当前所有节点的Pod:

kubectl get pods -n kube-system 查看指定名称空间的pods
kubectl get pods --all-namespaces 查看所有名称空间的pods
一定得是running状态;

10.加入节点:

在所有节点上执行:

kubeadm join 172.19.139.127:6443 --token hhegzh.uggnuqghirzomg3z \
    --discovery-token-ca-cert-hash sha256:787e5c54bf94938e0a57beaa5f092c2ca874df4a0d0cbff421a501e6d218de0c

在Master节点上:

kubectl get nodes  -- 查询当前主节点加入节点,必须所有节点状态都是Ready状态

在这里插入图片描述
查看Pod初始化进度:

watch kubectl get pod -n kube-system -o wide

在这里插入图片描述

11.测试安装Tomcat

在主节点上部署一个Tomcat:

kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8

获取K8s所有资源:

kubectl get all

在这里插入图片描述
获取各节点部署信息:

kubectl get pods -o wide

在这里插入图片描述

暴露nginx访问

kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort 
pod的80映射容器的8080;server会带来pod的80

查看服务:

kubectl get svc
kubectl get svc -o wide

在这里插入图片描述
访问31484接口:
在这里插入图片描述
测试动态扩容:

扩容:kubectl scale --replicas=3 deployment tomcat6
缩容:kubectl scale --replicas=1 deployment tomcat6

删除部署:

kubectl delete service/tomcat6

12.安装Ingress

通过Ingress发现pod进行关联。基于域名访问
通过Ingress controller实现POD负载均衡
支持TCP/UDP 4层负载均衡和HTTP 7层负载均衡
在这里插入图片描述部署Ingress controller

kubectl apply -f ingress-controller.yaml 

在这里插入图片描述
查看:

kubectl get pods --all-namespaces

在这里插入图片描述
测试:

touch ingress-tomcat6.yaml
kubectl apply -f ingress-tomcat6.yaml

13.安装kubernetes可视化界面——DashBoard

1).部署DashBoard:

kubectl apply -f  kubernetes-dashboard.yaml

2).访问主节点IP+端口:

https://47.101.215.199:30009

3)创建授权账号:

kubectl create serviceaccount dashboar-admin -n kube-sysem
kubectl create clusterrolebinding dashboar-admin --clusterrole=cluter-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $( kubectl -n kube-system get secret |awk '/dashboard-admin/{print $1}' )

.部署DashBoard:
在这里插入图片描述

kubectl apply -f  kubernetes-dashboard.yaml

2).访问主节点IP+端口:

https://47.101.215.199:30009

[外链图片转存中…(img-MA9VwqC3-1660713456153)]

3)创建授权账号:

kubectl create serviceaccount dashboar-admin -n kube-sysem
kubectl create clusterrolebinding dashboar-admin --clusterrole=cluter-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $( kubectl -n kube-system get secret |awk '/dashboard-admin/{print $1}' )

使用输出的token登录dashboard

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值