导读:k8s 的出现,是解决了什么市场痛点?
互联网早期,企业将服务直接部署在物理机上;后来由于一系列变化,经历了虚拟化部署,开始了 容器部署之路,Docker 无疑是其中的佼佼者。
但是,容器化部署方式也会出现一些问题,比如说:
代码语言:javascript复制一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器?
当并发访问量变大的时候,怎么样做到横向扩展容器数量?
当并发访问量下降的时候,怎么样去做到动态的缩容?
人工介入,手动操作吗?开什么玩笑啊?
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件,软件有很多,不过 k8s 背靠谷歌,脱颖而出。
k8s 主要提供以下服务:
代码语言:javascript复制(1)自动装箱:基于容器对应用运行环境的资源配置要求自动部署应用容器
(2)自我修复(自愈能力):当容器失败时,会对容器进行重启。当所部署的 Node 节点有问题时,会对容器进行重新部署和重新调度。当容器未通过监控检查时,会关闭此容器直到容器正常运行时,才会对外提供服务
(3)水平扩展:通过简单的命令、用户 UI 界面或基于 CPU 等资源使用情况,对应用容器进行规模扩大或规模剪裁
(4)服务发现:服务可以通过自动发现的形式找到它所依赖的服务。
(5)滚动更新:可以根据应用的变化,对应用容器运行的应用,进行一次性或批量式更新。
(6)版本回退:可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退
(6)密钥和配置管理:在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。
(7)存储编排:自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要。存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph 等)、公共云存储服务
(8)批处理:提供一次性任务,定时任务;满足批量数据处理和分析的场景。
(9)负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡。
环境准备
注:以下操作如未说明,即为在所有机器上执行。
注:安装过程中遇到问题可以在后台回复 “咨询“,我来看报错日志、
1、准备机器
Kubernetes集群大致分为两类:一主多从和多主多从(这里的主从指的是 master 管理节点和 node工作节点)。 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
我们选择安装一个 master 的集群。至于 node 数量可根据个人实际情况设定。
角色 | IP地址 | 操作系统 | 配置 |
---|---|---|---|
Master | 自行记录 | CentOS7.8 , | 4核CPU,4G内存,100G硬盘 |
Node1 | 自行记录 | CentOS7.8 , | 4核CPU,4G内存,100G硬盘 |
Node2 | 自行记录 | CentOS7.8 , | 4核CPU,4G内存,100G硬盘 |
这里建议配置成静态 IP,动态 IP 飘了的话挺麻烦的:【问题解决】虚拟机配置静态ip
这里有一个注意事项:建议不要修改分配给你的 IP 地址,因为如果你修改了网段,会出现连不上网的情况。
2、升级内核
在低版本的内核中会出现一些很让人恼火的Bug,时不时来一下,发作时候会导致整个OS无法执行任何命令。
(当然,对于学习者来说差别不大,学习的过程中免不了反反复复的重装集群…)
代码语言:javascript复制#在所有虚拟机上进行操作
#更新yum源仓库
yum update -y
#导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#查看可用的系统内核包
[root@vm01 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* elrepo-kernel: ftp.yz.yamagata-u.ac.jp
Available Packages
elrepo-release.noarch 7.0-5.el7.elrepo elrepo-kernel
...
#安装最新版本内核
yum --enablerepo=elrepo-kernel install -y kernel-ml
#查看系统上的所有可用内核
sudo awk -F' '$1=="menuentry " {print i " : " $2}' /etc/grub2.cfg
#设置默认版本,其中 0 是上面查询出来的可用内核
grub2-set-default 0
#生成 grub 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
#重启
reboot
#删除旧内核(可选)
#查看系统中全部的内核
rpm -qa | grep kernel
#删除旧内核的 RPM 包,具体内容视上述命令的返回结果而定
yum remove kernel-3.10.0-514.el7.x86_64
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64
kernel-tools-3.10.0-862.11.6.el7.x86_64
kernel-3.10.0-862.11.6.el7.x86_64
3、安装模块
代码语言:javascript复制#在所有虚拟机上操作
[root@k8s-master ~]# modprobe -- ip_vs
[root@k8s-master ~]# modprobe -- ip_vs_rr
[root@k8s-master ~]# modprobe -- ip_vs_wrr
[root@k8s-master ~]# modprobe -- ip_vs_sh
[root@k8s-master ~]# modprobe -- nf_conntrack_ipv4
modprobe: FATAL: Module nf_conntrack_ipv4 not found.
[root@k8s-master ~]# lsmod | grep ip_vs
ip_vs_sh 16384 0
ip_vs_wrr 16384 0
ip_vs_rr 16384 0
ip_vs 159744 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 159744 1 ip_vs
nf_defrag_ipv6 24576 2 nf_conntrack,ip_vs
libcrc32c 16384 3 nf_conntrack,xfs,ip_vs
[root@k8s-master ~]# lsmod | grep nf_conntrack_ipv4
4、系统设置
代码语言:javascript复制#关闭并停止防火墙,
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
5、配置主机名解析
这个 ip 要根据个人实际情况填写。
代码语言:javascript复制cat >> /etc/hosts << EOF
192.168.190.147 k8s-master
192.168.190.148 k8s-node1
EOF
6、设置 ipv4 转发
代码语言:javascript复制cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
7、时间同步
kubernetes要求集群中的节点时间必须精确一致,所以在每个节点上添加时间同步:
代码语言:javascript复制ntpdate time.windows.com
8、安装依赖软件包
代码语言:javascript复制yum install -y ipvsadm ipset sysstat conntrack libseccomp wget git
9、SSH免密登录
应该都会吧。
代码语言:javascript复制#此步操作在Master主机上进行
[root@vm01 ~]# ssh-keygen -t rsa
...
#配置公钥到其他节点,输入对方密码即可完成从master到node的免密访问
[root@vm01 ~]# ssh-copy-id k8s-node1
...
10、系统使能
代码语言:javascript复制sysctl -p
以上皆为版本无关的,接下来安装软件,就需要根据你选择的 k8s 版本而选择不同版本的软件了(指的是 Docker,kube 相关的和你的目的集群版本一致即可):
查看 k8s各版本 对应 各组件版本
11、安装 docker
代码语言:javascript复制# 1、切换镜像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2、查看当前镜像源中支持的docker版本
[root@master ~]# yum list docker-ce --showduplicates
# 3、安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3-3.el7 -y
# 4、配置加速
tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],
"live-restore": true,
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"storage-driver": "overlay2"
}
EOF
systemctl daemon-reload
systemctl restart docker
# 5、启动dokcer
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
12、安装Kubernetes组件
代码语言:javascript复制# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 5、设置kubelet开机自启
[root@master ~]# systemctl enable kubelet
13、准备集群镜像
1、查看 k8s 需要的镜像列表:
代码语言:javascript复制kubeadm config images list
2、拉取所需镜像。这里直接来个脚本拉取吧:
(这里面的镜像版本根据个人情况进行替换)
代码语言:javascript复制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
加上执行权限,运行。
集群初始化
参数根据个人情况自行替换。
master 节点
代码语言:javascript复制kubeadm init
--apiserver-advertise-address=192.168.190.141
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version=v1.17.4
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
上面这个命令只在 master 节点运行。
到这一步呀,基本也就差不多了,接下来得趁热打铁,因为这里面的数据要用,且有保质期的。
先按里面说的,先把这些信息给补上:
代码语言:javascript复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
node 节点
然后把最底下那串信息再看看,去 node 上执行一下,然后一步步按指引走,会看到:
代码语言:javascript复制kubeadm join 192.168.190.141:6443 --token d4dppl.t9zslzkvedzu7u36
--discovery-token-ca-cert-hash sha256:5f103e789f974027ff4d188e48b613a6911198942ae7efc9c73b401b7bdd6253
安装网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可,推荐 calico。 后台回复"网络插件"获取 calico.yaml,网上不好找。
下载完之后放到 master 节点中,进入相应目录,
代码语言:javascript复制kubectl apply -f calico.yaml
让子弹飞一会儿、
一定要等到它们都 running 了。当然如果没法 running,私信我,我来看日志。
其实能 kubectl 执行命令,接下来就可以往下走了。