Minikube是一个工具,可以在本地快速运行一个单节点微型K8s,仅用于学习、预览K8s的一些特性使用。
部署地址: https ://kubernetes.ioldocs/setup/minikube
Kubeadmin也是一个工具,提供kubeadm init和kubeadm join,用于快速部署K8s集群,相对简单。
https://kubernetes.io/docs/referencelsetup-tools/kubeadm/kubeadm/
生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签TLS证书,组成K8s集群,新手推荐。
https://github.com/kubernetes/kubernetes/releases
k8s集群master01:192.168.121.20 kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群node01:192.168.121.19 kubelet kube-proxy docker flannel
k8s集群node02:192.168.121.18
etcd集群节点1:192.168.121.17 etcd
etcd集群节点2:192.168.121.16
etcd集群节点3:192.168.121.15
负载均衡nginx+keeplive01(master):192.168.121.14
负载均衡nginx+keeplive01(backup):192.168.121.13
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值对数据库。etcd内部采用raft协议作为一致性算法,etcd是go语言编写的。
etcd目前默认使用2379端口对外提供HTTP服务,使用2380端口进行内部通讯。
etcd在生产环境中一般推荐集群方式部署。由于etcd的leader选举机制,要求至少3台或以上的奇数台。
CFSSL使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,CFSSL提供了方便的命令行生成配置文件。CFSSL用来为etcd提供TLS证书,它支持签三种类型的证书:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson linux-amd64 -0 /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -0 /usr/local/bin/cfssl-certinfo
或
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/ local/bin/ cfssl*
-------------------------------------------------------------------------------------
cfssl:证书签发的工具命令
cfssljson:将 cfssl生成的证书(json格式)变为文件承载式证书
cfssl-certinfo:验证证书的信息
cfssl-certinfo -cert<证书名称> #查看证书的信息
mkdir /opt/k8s
cd /opt/k8s/
mkdir /opt/k8s/
cd /opt/k8s/
rz -E
chmod +x etcd-cert.sh etcd.sh
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert
vim /opt/k8s/etcd-cert/etcd-cert.sh
cd /opt/k8s/etcd-cert
./etcd-cert.sh
//把etcd解压包上传到/k8s目录中并解压
rz -E
tar zxvf etcd-v3.3.10-linux-amd64.tar.gz
mkdir -p /opt/etcd/{
cfg,bin,ssl}
mv /opt/k8s/etcd-v3.3.10-linux-amd64/etcd /opt/etcd-v3.3.10-linux-amd64/etcdctl /opt/k8s/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
//进入卡住状态等待其他节点加入,这里需要三台etcd服务同时启动,如果只启动其中一台后,服务会卡在那里,直到集群中所有etcd节点都已启动,可忽略这个情况
./etcd.sh etcd01 192.168.121.17 etcd02=https://192.168.121.16:2380,etcd03=http://192.168.121.15:2380
使用另外一个会话打开,会发现etcd进程已经开启
ps -ef | grep etcd
scp -r /opt/etcd/ 192.168.121.16:/opt/
scp -r /opt/etcd/ 192.168.121.15:/opt/
scp /usr/lib/systemd/system/etcd.service 192.168.121.15:/usr/lib/systemd/system
scp /usr/lib/systemd/system/etcd.service 192.168.121.16:/usr/lib/systemd/system
vim /opt/etcd/cfg/etcd
##将配置文件中的IP地址改成该节点的IP地址
systemctl start etcd.service
systemctl status etcd.service
ln -s /opt/etcd/bin/etcdctl /usr/local/bin/ 做一个软连接让系统可以识别
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.15:2379,https://192.168.121.16:2379" cluster-health
##通过这条命令检查etcd集群的健康状态
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.15:2379,https://192.168.121.16:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
##通过这条命令查看etcd集群的状态
##切换到etcd3版本查看集群系欸但状态和成员列表
export ETCDCTL_API=3
##显示etcd的版本和当前的状态
etcdctl --write-out=table endpoint status
##显示etcd集群的成员状态
etcdctl --write-out=table member list
第一个Master节点
1、准备cfss证书生成工具
2、生成证书
3、准备etcd二进制包
4、生成etcd的服务管理文件
5、启动etcd
后面Node节点
1、在Master节点上把etcd01的配置文件、可执行文件、证书,etcd服务管理文件都复制发送到etcd后面的Node节点中
2、在Node节点上修改收到的etcd配置文件,将IP地址改成自己主机的IP
3、启动etcd服务,会自动加入集群
最后可以在Master节点上查看集群状态
//所有node节点部署docker引擎
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo ##注意用阿里云安装
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker #启动docker
systemctl enable docker #设置开机自启动
叠加网络是在二层或者三层基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路隧道连接起来(类似于VPN)。
将源数据包封装到UDP中,并使用基础网络的IP/NAc作为外层报文头进行封装,然后在以太网上传输,到达目的地后由隧道端点解封装并将数据发送给目标地址。
同一个节点中的Pod之间是通过docker0来通信的,不同节点的Pod之间要通信的话可以通过Flannel网络插件来完成。node1首先把数据包通过docker0发送给flannel0,flannel部署在各个节点中会将本节点的IP和MAC地址都保存在etcd中,flannel0收到pod发送来的数据之后会进行封装成UDP,UDP中有源数据的IP和MAC地址和目的IP和MAC地址,然后根据etcd里维护的路由表通过物理网卡转发给node2,部署在node2上的flannel收到后会进行解封装,暴露出里面目的Pod的IP由flannel0转发给docker0,最终转发给对应的Pod。
存储管理Flannel可分配的IP地址段资源
监控etcd中每个Pod的实际地址,并在内存中简历维护Pod节点路由器
//添加flannel网络配置信息,写入分配的子网段到etcd中,供flannel使用
cd /opt/etcd/ssl
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.16:2379,https://192.168.121.15:2379" set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'
##这里Flannel的转发类型是vxlan,vxlan的性能更好一点;系统默认是udp
//查看写入的信息
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.121.17:2379,https://192.168.121.16:2379,https://192.168.121.15:2379" get /coreos.com/network/config
//上传flannel.sh和flannel-v0.10.0-linux-amd64.tar.gz到/opt目录中,解压flannel压缩包
cd /opt
tar zxvf flannel-v0.10.0-linux-amd64.tar.gz
flanneld ##flanneld为主要的执行文件
mk-docker-opts.sh ##mk-docker-opts.sh脚本用于生成Docker启动参数
README.md
mkdir /opt/kubernetes/{
cfg,bin,ssl} -p
mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/
cd /opt
chmod +x flannel.sh
./flannel.sh https://192.168.121.15:2379,https://192.168.121.16:2379,https://192.168.121.17:2379
##查看flannel是否启动成功
systemctl status flannel (其实执行脚本会自动帮我们启动flannel)
ifconfig
#查看网卡信息,发现多了一个flannel的网卡,可以看到flannel分配的网段
但是这是发现docker0网卡的网段没有和flannel的网段同步
##更改docker的启动项
vim /usr/lib/systemd/system/docker.service
#在12行下添加
EnvironmentFile=/run/flannel/subnet.env ##指定docker网络的配置文件
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock
##重载并重启docker
systemctl daemon-reload
systemctl restart docker.service
这时候再ifconfig,发现docker0的网段和flannel的网段一致了
docker0:*.*.*.1
flannel:*.*.*.0
ping -I 172.17.81.1 172.17.18.1
也可以进入容器里面进行ping测试
docker run -it centos:7 /bin/bash
yum install net-tools -y ##安装网络服务插件