centos7虚拟机从零开始搭建docker与k8s集群到使用

十分钟搭建好集群,简单介绍下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”
无需最后五行内容

centos7虚拟机从零开始搭建docker与k8s集群到使用_第1张图片

静态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

成功后出现如下图

centos7虚拟机从零开始搭建docker与k8s集群到使用_第2张图片

记住最后三行,后面加入节点用

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
centos7虚拟机从零开始搭建docker与k8s集群到使用_第3张图片

(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

#稍等片刻,再次查看集群节点的状态
centos7虚拟机从零开始搭建docker与k8s集群到使用_第4张图片

到此集群搭建完成

(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

centos7虚拟机从零开始搭建docker与k8s集群到使用_第5张图片
这里看到80端口映射到32260
依次访问192.168.189.200,201,202,203:32260

centos7虚拟机从零开始搭建docker与k8s集群到使用_第6张图片
centos7虚拟机从零开始搭建docker与k8s集群到使用_第7张图片

(18)补充常用k8s命令

你可能感兴趣的:(Kubernetes,docker,linux,运维)