k8s的开篇学习和安装
k8s的开篇学习
学习网站
参考资料
1。 K8S能干什么
[概述 | Kubernetes](https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do)
需要开代理2。docker资料
https://docs.docker.com/get-started/
3.prometheus资料
https://prometheus.io/docs/introduction/overview/
开篇前言
不能站在上帝视角,一开始就大而全的去理解k8s所有组件,对于新人入门是灾难。
前期,抓住重点,学会安装,应用部署,不断加入新组件,理解该组件能解决什么问题。
才是循序渐进的学习方法当然,在课余时间,为了掌握这一类重量级的技术,必须得看资料,理解为什么k8s提供那么多组件,以及作用.
为什么要学习k8s
1.1 iptables规则,为了理解防火墙作用、以及实现对数据包的转发,修改作用,源ip:port 目标ip:port 协议等。
1.2 虚拟化kvm
1.3 容器技术,容器,镜像,仓库,网络
1.4 从单个的容器管理命令,升级为yaml形式的资源描述文件,以及提供了相应的编排能力,运行、管理一组多个容器
以及容器之间会共同使用到的,如桥接网络网段,如创建的数据卷Volume,也可以在多个容器之间共享数据。1.5 问题又来了,你这只是在单机的如docker-200机器上操作一堆容器,容器需要部署在多个机器上呢?
你后端需要运行的一组如4个容器,不能只在一个宿主机上跑吧,那不还是公用的单一的宿主机配置吗?1.6 因此容器需要跨主机部署,以及配置跨主机的容器通信方案
1.7 以及容器运行在了多个机器上,容器就是你后端么,如何确保对容器的资源使用率监控?容器内服务监控?
是不是也得手工去维护docker?
- 如上诸多问题,在容器规模上来,跨机器的部署,就推进了容器编排技术必须要继续发展,开发出强大的编排工具
解决上述的问题,以及更多的问题。这就是 k8s为什么出现了。
运维的方式就彻底颠覆了,容器多机器编排的工具,必须得有开发代码的编写方式,也彻底的颠覆了系统,都是分开发的,多个小组件运行一个一个容器里
这个就叫做
微服务
也就是技术就是一步一步演化而来。
k8s软件介绍
- 纯docker的运行模式,是docker主机单独的去管理一堆的容器应用,但发现数量多了以后,配置复杂,就难以管理多个容器,并且跨主机下的容器集群,更是维护复杂。
- 业务数量庞大,那些容器部署在那些节点使用了那些的端口,如何记录,管理,需要登陆到每一台机器去管理。
- 跨主机的通信,多个机器中的容器之间相互调用如何做,IP tables规则手动维护,
- 跨主机容器的调用,配置如何写,ip和端口
- 如何实现业务的高可用性,多个容器对外提供服务如何实现负载均衡。
- 如何实现滚动升级业务的连续性。
k8s的介绍
-
Kuberneter 也被称为k8s,是用于自动化的部署,扩缩和管理容器应用化程序的开源系统。
-
他将组成的应用系统组合成逻辑单元,以便于管理和服务发现
-
Kubernets 来源于Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
-
Google每周运行10亿个容器,kubernets基于相同的设计原理,能够在不扩张运维团队的前提下,进行规模性的管理。
-
从官方的资料来看,就已经解决了容器化的管理问题。
为什么会出现k8s
部署时代架构
v1 物理机
↓
v2 虚拟化,vmware 商业版为代表,出现开源版的 openstack
↓
v3 容器化部署,容器化大规模应用后,难以维护,出现了
↓
k8s技术
k8s 是一个平台框架
- k8s提供了很多功能,简化了对容器的部署管理
- 基于容器对应用的发布管理,更新,升级,降级。
- 负载均衡,服务发现。
- 跨机器,跨地区的网络管理模式
- 自动扩缩容器功能
- 针对nginx无状态服务运行模式,如mysql等有状态的运行组件
- 支持丰富的插件。
- k8s并不是包罗万象,它本身只有自己的组件,而其他的功能,如消息列队,数据库,存储都需要安装在K8S上
k8s的本质是一个大而全的一个平台,组件很多,提供了很多的功能组件,目的是为了更好的管理容器。
- 所以K8S的组件是专门用来保障,应用的发布的高可用性弹性扩缩
- 升级降级的一个重要的组件,
- 还有专门用来维护,网络,存储,等K8S的其他组件
- 因此学习的路线是1.先学会应用的部署,无状态的应用,2.学习其他的组件,部署容器
k8s核心架构
如何设计一个容器管理平台
- 集群架构,管理节点分发到数据节点
- 如何部署业务容器到各个数据节点
- N个数据节点,业务容器如何选择部署到合理的节点
- 容器如何实现多副本,如何满足每个机器都部署一个容器模型
- 多副本如何实现负载均衡
分布式系统分为二种角色:管理节点和工作节点
从系统架构来看,k8s分为2个节点
master 控制节点,包工头
node 工作节点 工人
提供啦很多组件,方便你去各个角度更好的维护,管理容器
1. 容器的高可用性,数量的保障,版本的升级
2, 容器之间的网络关系
3, 容器之间的数据共享关系
4, 容器内的配置文件\
...........
都是K8S提供的各个组件
k8s组件通信架构图
- k8s集群,至少需要2台ecs机器
- k8s的本身,也是以容器运行
- k8s集群是被一组被称为Node的节点组成的,这些节点运行K8S管理进程的容器
- 具体的Node节点机器上运行的容器被叫做pod的组件管理
- 安装完k8s后,就得到啦一个集群的环境
- 集群指的是有一堆Node节点的机器,并且这些节点运行pod,也就是容器了。
理解k8s核心几块资源
k8s默认的组件很多,每一个pod控制器(工作负载),以及网络插件组件,没法一个个的去读,前期也都被封装在了底层,也关心不到。
因此,只聊我们能用到的几个组件,如pod创建,需要用到几个组件,需要背一背,以及查看对应的资源,再机器上的容器进程信息。
后续不断的加入新知识,再去理解对应的组件
即可循序渐进的理解,k8s的复杂知识。
当然,建议也是,平日里,看k8s官网文档,以及如k8s权威指南 v5版本的书籍,去阅读理论知识,扩充自己的理论知识,更合适。
v1-v5
上课,为了更快速的,理解,操作,k8s组件该如何玩
- 快速学会玩法
- 再去看资料理解本质原理
node概念
ECS机器,k8s运行的一个环境。
pod等资源,属于k8s安装好后的,集群内的一个资源信息。
1.k8s工作节点,node,运行环境可以是::::vmware创建的一个虚拟机 ,k8s-node-11 k8s-node-12
2.node上具体运行啥?运行容器,k8s部署的应用,都是跑再容器里,还得装docker
- 初始化,运行工作节点,或者主节点,背后逻辑就是
- 下载k8s自身的一些组件的镜像
- 运行镜像,创建对应的容器,到对应的目标机器上(k8s-master、k8s-node)
k8s-node的部署逻辑图
1. pod的IP是随着变化的,删除pod,ip变化
2. pod内都有一个根容器
4. 一个pod内可以有一个、多个容器
5.一个pod内的所有容器,共享根容器的网络名称空间,文件系统,进程资源
6.一个pod内的容器网络地址,由根容器提供。
k8s集群安装部署
带着理论,再去部署,验证你的理论
-
准备3台机器,注意配置,别太低,否则跑不起来。
-
系统初始化配置,如ntp等
主机名、节点ip、部署组件
# k8s kubeadm 一键自动化,安装k8s集群,安装所有运行需要的组件
# k8s-master 10.0.0.10 etcd, kube-apiserver, kube-controller-manager, kubectl, kubeadm, kubelet, kube-proxy, flannelk8s-node1 10.0.0.11 kubectl, kubelet, kube-proxy, flannel,dockerk8s-node2 10.0.0.12 kubectl, kubelet, kube-proxy, flannel,docker确保三台机器,的跨节点的容器互相通信,装网络插件flannel
环境初始化
cat >>/etc/hosts <<'EOF'
10.0.0.10 k8s-master-10
10.0.0.11 k8s-node-11
10.0.0.12 k8s-node-12
EOFping -c 2 k8s-master-10
ping -c 2 k8s-node-11
ping -c 2 k8s-node-12
防火墙初始化
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManagersed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld && systemctl stop firewalldgetenforce 0iptables -F
iptables -X
iptables -Ziptables -P FORWARD ACCEPT
关闭swap
k8s默认禁用swap功能
swapoff -a
# 防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
yum源配置
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/*.repoyum clean all && yum makecache fast
ntp配置
yum install chrony -ysystemctl start chronyd
systemctl enable chronyddate# 修改配置文件,加入ntp.aliyun.com上游地址即可ntpdate -u ntp.aliyun.comhwclock -w
修改linux内核参数,开启数据包转发功能
# 容器夸主机通通信,底层是走的iptables,内核级别的数据包转发cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOFmodprobe br_netfilter
# 加载读取内核参数配置文件
sysctl -p /etc/sysctl.d/k8s.conf
安装docker基础环境()
yum remove docker docker-common docker-selinux docker-engine -y curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum makecache fastyum list docker-ce --showduplicatesyum install docker-ce-19.03.15 docker-ce-cli-19.03.15 -y#配置docker加速器、以及crgoup驱动,改为k8s官方推荐的systemd,否则初始化时会有报错。mkdir -p /etc/docker
# 这里使用的是你自己的华为云的镜像id,不要使用我的这个容器加速镜像
cat > /etc/docker/daemon.json <<'EOF'
{"registry-mirrors": [ "https://58698f75ac8e4e98bbb253a7e9b31657.mirror.swr.myhuaweicloud.com" ]
}
EOF#启动
systemctl start docker && systemctl enable dockerdocker version
安装k8s的初始化
[root@k8s-master-10 ~]#cat init-k8s.sh
#设置阿里云源curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repocurl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repocat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum clean all && yum makecache#yum list kubeadm --showduplicates 列出,这个阿里云k8s源,提供了哪些k8s版本让你玩
# 这个脚本看懂1111# 安装指定版本 kubeadm-1.19.3 ,安装的kubeadm版本,就是决定了,拉去什么版本的k8s集群版本的镜像yum install kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 ipvsadm -y
初始化k8s-master主节点(只在主节点执行)
# kubeadm init 初始化,加入一些参数#
kubeadm init \
--apiserver-advertise-address=10.0.0.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.3 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.2.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPUkubeadm init \
--apiserver-advertise-address=10.0.0.10 \ # api-server运行再k8s-master的ip上
--image-repository registry.aliyuncs.com/google_containers \ # 拉去k8s镜像,从阿里云上获取,否则默认是国外的k8s镜像地址,下载不了
--kubernetes-version v1.19.3 \ # 和kubeadm保持一直
--service-cidr=10.1.0.0/16 \ # k8s服务发现网段设置,service网段
--pod-network-cidr=10.2.0.0/16 \ # 设置pod创建后,的运行网段地址
--service-dns-domain=cluster.local \ # k8s服务发现网段设置,service资源的域名后缀
--ignore-preflight-errors=Swap \ # 忽略swap报错
--ignore-preflight-errors=NumCPU # 忽略cpu数量报错
中间的组件创建过程,以及ssl证书创建过程,暂时不用看,以后回国头再看# k8s-master成功装好了Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:
# 创建k8s集群配置文件
# 制定了,默认的ssl整数在哪,api-server的地址,等mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config======================-===============
# pod分布再多个机器上,pod互相之间链接,得部署,集群网络,选用flannel网络插件
# 安装,使用即可。You should now deploy a pod network to the cluster.
==================================
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/# 使用如下命令,将k8s-node加入集群即可,
Then you can join any number of worker nodes by running the following on each as root:
===================================================# join添加到集群中====================================
[root@k8s-master-10 ~]## k8s-master初始化结果,讲解,听懂6666Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 10.0.0.10:6443 --token gwv20l.vjex2uud3ng450ig \--discovery-token-ca-cert-hash sha256:fce52138a94d585d07015dbf718e39b5ba3c7988021c5ef98bf8af6c5be191dd
[root@k8s-master ~]# #添加这个join
此时主节点就可以用
查看 k8s集群状态,查看有哪些工作节点
客户端命令
# 可以直接和api-server交互,查询 你要的信息 # 这个命令,默认会去加载ssl证书,确保安全
# 以后再聊,kubectl的整数添加参数
# 再主节点上,使用这个命令是可以直接用的kubectl get nodes # 显示更详细的信息kubectl get nodes -owide
## 查看kubeadm 版本,初始化的k8s版本信息,就是 v1.19.3版本$ kubeadm version[root@k8s-master-10 ~]#kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:47:53Z", Go## 设置kubelet开机启动
systemctl enable kubelet
systemctl enable docker
如何让集群就绪呢?部署网络插件
# 1. 下载网络插件的,配置文件 ,yaml以及配置文件
git clone --depth 1 https://github.com/coreos/flannel.git# 2.再k8s主节点上,应用这个yaml,基于yaml,创建具体的pod过程。# 3.如果需要修改pod运行网络的话,要改配置文件,
/root/flannel-master/Documentation/kube-flannel.yml# 创建k8s资源,都是写这种yml文件了[root@k8s-master-10 ~/flannel-master/Documentation]#grep 'Network' -A 5 kube-flannel.yml "Network": "10.2.0.0/16","Backend": {"Type": "vxlan"}}
---# 修改的第二处,夸主机的容器通信,最终不得走宿主机的物理网卡。
# 告诉flannel的你物理网卡是谁containers:- name: kube-flannel#image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgr- --iface=ens33# 基于kubectl命令,应用这个yml文件,读取,以及创建pod资源[root@k8s-master-10 ~/flannel-master/Documentation]#kubectl create -f ./kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created# 查看当前机器的容器,关于flannel网络插件的进程
[root@k8s-master-10 ~/flannel-master/Documentation]#docker ps |grep flannel
812ebf6b0578 registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 31 seconds ago Up 31 seconds k8s_POD_kube-flannel-ds-9x4l2_kube-flannel_37b34022-cc0d-47c3-b677-3fe657374dbc_0修改pod网络的网段地址,根据kubeadm init 初始化时,设置的地址来