容器化部署的好处:之前采用普通方式部署项目,做不到互相隔离,若一个项目内存泄露,会导致服务器不可用,而docker容器化管理避免了这种情况,k8s相当于对docker容器化管理的生态将所有容器编排起来,对容器服务自动管理
主要功能:
服务器发现与负载均衡
存储编排(当服务申请内存由k8s管理,当服务器不用后,会自动清理)
自动部署和回滚、自动装箱计算:若应用出现问题回滚到上一个版本,控制每个应用占的内存、cpu大小
自我修复:可以监控到服务器里的应用,若一台服务器挂到后,会自动放到其他机器上
Kubernetes 组件介绍
-
一个 kubernetes 集群主要由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。 -
控制节点(master):集群的控制平面,负责集群的决策。 -
-
-
-
-
工作节点(node):集群的数据平面,负责为容器提供运行环境。 -
-
-
组件工作流程
-
以部署一个 Nginx 服务来说明 Kubernetes 系统各个组件调用关系: -
① 首先需要明确,一旦 Kubernetes 环境启动之后,master 和 node 都会将自身的信息存储到etcd数据库中。 -
② 一个Nginx服务的安装请求首先会被发送到 master 节点上的 API Server 组件。 -
③ API Server 组件会调用 Scheduler 组件来决定到底应该把这个服务安装到那个 node 节点上。此时,它会从 etcd 中读取各个 node 节点的信息,然后按照一定的算法进行选择,并将结果告知 API Server 。 -
④ API Server 调用 Controller-Manager 去调用 Node 节点安装 Nginx 服务。 -
⑤ Kubelet 接收到指令后,会通知 Docker ,然后由 Docker 来启动一个 Nginx 的 Pod 。Pod 是 Kubernetes 的最小操作单元,容器必须跑在 Pod 中。 -
⑥ 一个 Nginx 服务就运行了,如果需要访问 Nginx ,就需要通过 kube-proxy 来对 Pod 产生访问的代理,这样,外界用户就可以访问集群中的 Nginx 服务了
其他节点
-
Master:集群控制节点,每个集群要求至少有一个 Master 节点来负责集群的管控。 -
Node:工作负载节点,由 Master 分配容器到这些 Node 工作节点上,然后 Node 节点上的 Docker 负责容器的运行。 -
Pod:Kubernetes 的最小控制单元,容器都是运行在 Pod 中的,一个 Pod 中可以有一个或多个容器。 -
Controller:控制器,通过它来实现对 Pod 的管理,比如启动 Pod 、停止 Pod 、伸缩 Pod 的数量等等。 -
Service:Pod 对外服务的统一入口,其下面可以维护同一类的多个 Pod 。 -
Label:标签,用于对 Pod 进行分类,同一类 Pod 会拥有相同的标签。 -
NameSpace:命名空间,用来隔离 Pod 的运行环境。
集群环境的搭建
查看虚拟机版本,最好是7.5以上的
cat /etc/redhat-release?
配置主机名解析,方便引用
vim /etc/hosts
加入解析 192.168.6.100 master 192.168.6.101 node1 192.168.6.102 node2
ping看能不能ping通
时间同步:kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步
systemctl start chronyd systemctl enable chronyd ?#开机自启 date ? ? ? ? ? ? ? ? ? ? ?#查看时间
docker启动会产生iptables规则,防止系统混淆需要关闭,系统没自带则不用处理
#关闭防火墙 systemctl stop firewalld systemctl disable firewalld #关闭iptables服务 systemctl stop iptables systemctl disable iptables #禁用Linux安全服务 查看selinux是否开启 getenforce #永久关闭selinux,需要重启 vim /etc/selinux/config? SELINUX=disabled #临时关闭selinux,重启之后,无效 setenforce 0
关闭swap分区:虚拟内存分区,物理内存使用完后,将磁盘开机当虚拟内存使用
vim /etc/fstab? #注释掉最后一行 #/dev/mapper/centos-swap swap ? ? ? ? ? ? ? ? ? ?swap ? ?defaults
修改Linux内核参数,创建配置文件
vim /etc/sysctl.d/kubernetes.conf
#桥接的IPv4流量传递到iptables的链 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
重新加载配置
sysctl -p
加载网桥过滤模块
modprobe br_netfilter
?查看是否加载
lsmod | grep br_netfilter
配置ipvs功能
在k8s中service有两种代理模型,一种是iptables一种是ipvs的,ipvs性能较高一些
手动载入ipvs模块
yum -y install ipset ipvsadm
添加对应的脚本文件,编写对应内容
cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF
添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
执行文件,载入模块
/bin/bash /etc/sysconfig/modules/ipvs.modules
检查是否成功
lsmod | grep -e ipvs -e nf_conntrack_ipv4
此时环境配置好了,重启? ? ?reboot
每个节点安装Docker、kubeadm、kubelet和kubectl
安装docker
#切换镜像 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.3.ce-3.el7
添加配置文件,docker默认使用cgroupfs,k8s推荐使用systemd
mkdir /etc/docker vim daemon.json? #输入以下内容 { ? "exec-opts":["native.cgroupdriver=systemd"], ? "registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"] }
卸载docker
yum list installed|grep docker ? 查看docker安装列表 yum -y remove xxx?? ??? ??? ??? ? 卸载查出来的名称即可 systemctl enable docker ? ? ? ? ?自启
安装k8s组件
切换镜像源
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 --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 ?-y 卸载 rpm -e kubelet-1.18.0 kubelet-1.18.0 kubelet-1.18.0 --nodeps
为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,"/etc/sysconfig/kubelet"文件的内容
# 改为 KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs"
开机自启
systemctl enable kubelet
集群配置
因为k8s是国外网站,下载需要配置镜像,指定下载版本
查看所需镜像
kubeadm config images list
指定固定版本
images=( ?? ?kube-apiserver:v1.17.4 ?? ?kube-controller-manager:v1.17.4 ?? ?kube-scheduler:v1.17.4 ?? ?kube-proxy:v1.17.4 ?? ?pause:3.1 ?? ?etcd:3.4.3-0 ?? ?coredns:1.6.5 )
循环遍历下载
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 ? ? docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
查看镜像有没有下成功 docker images
只部署k8s的Master节点
kubeadm init \ ? --kubernetes-version v1.17.4 \ ? --service-cidr=10.96.0.0/12 \ ? --pod-network-cidr=10.244.0.0/16 \ ? --apiserver-advertise-address=192.168.6.100
命令行会提示
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
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/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.6.101:6443 --token sv5epz.4f8hvj7ukjlrv857 \
--discovery-token-ca-cert-hash sha256:56bc77d7c4c95cc7aca777185e14274e4f99bc8d3b21da65d89ff19987e83554
接着输入
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
在其他服务器上输入
kubeadm join 192.168.6.101:6443 --token sv5epz.4f8hvj7ukjlrv857 \ ? ? --discovery-token-ca-cert-hash sha256:56bc77d7c4c95cc7aca777185e14274e4f99bc8d3b21da65d89ff19987e83554?
查看节点
kubectl get nodes
接着输入后node节点没连接上,查了下原因说是node节点不能自启,需要把master节点的/etc/kubernetes/admin.conf文件复制到node节点的服务器上
安装网络插件,在master节点
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
使用配置文件启动flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看部署CNI网络插件进度:
kubectl get pods -n kube-system
查看集群健康状况:
kubectl get cs
|