十分钟搭建好集群,简单介绍下k8s
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
存储编排:可以根据容器自身的需求自动创建存储卷
kubernetes概念
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
> 以下为搭建过程,推荐最低配置2核2gb,低于这个配置会随时奔溃出现内存不足导致的各种错误
(1)静态ip修改
vi /etc/sysconfig/network-scripts/网卡名 动态ip只需要更改BOOTPROTO=“dhcp”
无需最后五行内容
静态ip则更改BOOTPROTO=“static” 然后添加最后五行内容
(2)修改hostname
vi /etc/hostname内部更换
> hostname systemctl restart systemd-hostnamed重启查看
> hostnamectl set-hostname master, hostname设置查看
(3)主机名解析
vi /etc/hosts
192.168.189.200 master
192.168.189.201 node1
192.168.189.202 node2
192.168.189.203 node3
(4)时间同步(chronyd服务从网络同步时间)
#启动chronyd服务,设置开机自启动,date验证
systemctl start chronyd
systemctl enable chronyd
date
(5)禁用防火墙 ,iptables和firewalld服务
#1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
#2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
(6) 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
#编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
#注意修改完毕之后需要重启linux服务
> SELINUX=disabled
(7)禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
swapoff -a
echo "vm.swappiness = 0">> /etc/sysctl.conf
(8)修改linux内核参数
#修改linux的内核参数,添加网桥过滤和地址转发功能
#编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
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
(9)配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
#1安装ipset和ipvsadm
yum install ipset ipvsadmin -y && yum install ipvsadm -y
#2添加需要加载的模块写入脚本文件
cat <<EOF > /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
#3 为脚本文件添加执行权限 ,执行脚本文件,并加载检查
chmod +x /etc/sysconfig/modules/ipvs.modules
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
(10)更换阿里云镜像
配置dns,更换镜像位置
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
(11)安装docker
1安装特定版本的docker-ce
#必须指定–setopt=obsoletes=0,否则yum会自动安装更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
2缺少包则补全下面下载
yum install epel-release -y yum install container-selinux -y yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
3 添加配置
#Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
4检查docker状态和版本
systemctl restart docker
docker version
(12)安装kubernetes组件
#由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
vi /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.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#安装kubeadm、kubelet和kubectl yum install --setopt=obsoletes=0
kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
#配置kubelet的cgroup
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
vi /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
设置开机自启动
systemctl enable kubelet
(13)准备集群镜像
建一个image.sh文件 vi image.sh
添加
#下载镜像
#此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案
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
)
images=(
kube-apiserver:v1.17.17
kube-controller-manager:v1.17.17
kube-scheduler:v1.17.17
kube-proxy:v1.17.17
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
chmod +x image.sh ./image.sh 下载集群镜像
(14)集群初始化(保证在2核2gb以上)
(一)在master节点的配置(出现超时40s就不要加上apiserver-**-address那一行)
否则只能使用内网,使用公网参考https://my.oschina.net/u/4389078/blog/3233116
kubeadm init \
--kubernetes-version=v1.17.4
--pod-network-cidr=10.244.0.0/16
--service-cidr=10.96.0.0/12
--ignore-preflight-errors=Swap
--image-repository=registry.aliyuncs.com/google_containers
--apiserver-advertise-address=124.223.67.237
> 创建必要文件 ,这里的config是初始化后出来的
> mkdir -p $HOME/.kube
> sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
> sudo chown $(id -u):$(id -g) $HOME/.kube/config
成功后出现如下图
记住最后三行,后面加入节点用
kubeadm join 192.168.189.200:6443 --token fvmd0b.7cna6pekssjqrpro --discovery-token-ca-cert-hash sha256:04081d6e1f2681c77efdc80c46570adb92b49be1b8b479f92d8afc92a6c7bbe8**
加载环境环境并生效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>
~/.bash_profile source ~/.bash_profile
(二)在node节点配置
#将node节点加入集群 [root@master ~]#
kubeadm join 192.168.189.200:6443 \ --token 8507uc.o0knircuri8etnw2 \ --discovery-token-ca-cert-hash \
sha256:acc37967fb5b0acf39d7598f8a439cc7dc88f439a3f4d0c9cae88e7901b9d3f
#查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件
kubectl get nodes 查看nodes
(15)安装pod网络插件
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel
下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行
#获取fannel的配置文件
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#使用配置文件启动fannel
[root@master ~]# kubectl apply -f kube-flannel.yml
到此集群搭建完成
(16)测试集群,这里以ngnix为例
#部署
nginx kubectl create deployment nginx --image=nginx:1.14-alpine
#暴露端口
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
#查看服务状态
[root@master ~]# kubectl get pods,service
这里看到80端口映射到32260
依次访问192.168.189.200,201,202,203:32260
(18)补充常用k8s命令