docker 和 k8s 环境搭建 (kubeadmin 方式)
声明:所有文章只作为学习笔记用,转载非原创
https://www.jianshu.com/p/5a911f20d93e
基础概念 请看另外一篇 或者之前的文章
https://segmentfault.com/a/1190000020113347
https://blog.csdn.net/finalkof1983/article/details/85568387
https://www.jianshu.com/p/502544957c88
https://segmentfault.com/a/1190000020113347
搭建: 必看
https://k8s-install.opsnull.com/01.%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F.html
https://www.cnblogs.com/tianleblog/p/12108391.html
https://www.kubernetes.org.cn/5077.html
https://blog.csdn.net/xinzuini/article/details/103505663
https://blog.csdn.net/weixin_41581795/article/details/103501022
https://blog.csdn.net/u013355826/article/details/82801482
看看
https://blog.csdn.net/liukuan73/article/details/83116271
https://www.cnblogs.com/imstrive/p/11409008.html
看看
https://blog.csdn.net/subfate/article/details/103774072
看看
https://blog.csdn.net/fuck487/article/details/101831415
看看
https://www.cnblogs.com/xiexun/p/9527979.html
# [白话 flannel 和 calico 网络原理](https://www.lbbniu.com/6548.html)
[https://www.lbbniu.com/6548.html](https://www.lbbniu.com/6548.html)
Kubernetes CNI 插件 网络最强对比:Flannel、Calico、Canal和Weave
https://blog.csdn.net/RancherLabs/article/details/88885539
CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,我们将集中探索与对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal(技术上是多个插件的组合)。这些插件既可以确保满足Kubernetes的网络要求,又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。
插件负责为接口配置和管理IP地址,并且通常提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次调用它以清理这些资源。
运行时或协调器决定了容器应该加入哪个网络以及它需要调用哪个插件。然后,插件会将接口添加到容器网络命名空间中,作为一个veth对的一侧。接着,它会在主机上进行更改,包括将veth的其他部分连接到网桥。再之后,它会通过调用单独的IPAM(IP地址管理)插件来分配IP地址并设置路由。
在Kubernetes中,kubelet可以在适当的时间调用它找到的插件,来为通过kubelet启动的pod进行自动的网络配置。
flannel
https://www.jianshu.com/p/e4c7f83a2a0b
https://www.jianshu.com/p/e4c7f83a2a0b
https://blog.csdn.net/liumiaocn/article/details/88835527
官方flannel git [https://github.com/coreos/flannel](https://github.com/coreos/flannel)
官方CNI(Container Network Interface Specification) [https://github.com/containernetworking/cni/blob/master/SPEC.md](https://github.com/containernetworking/cni/blob/master/SPEC.md)
版本问题
#点击相应的版本,查看change.log
https://github.com/kubernetes/kubernetes/releases
https://stackoverflow.com/questions/53256739/which-kubernetes-version-is-supported-in-docker-version-18-09
一些初始化工作:
如果之前安装过
yum remove docker docker-common docker-selinux docker-engine
yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
关闭防火墙
关闭SELinux
配置ntp
配置hosts
# /etc/hosts文件如下:每台主机都要配置
# tail -3 /etc/hosts
192.168.174.200 master.xx.com master
192.168.174.201 node1.xx.com node1
#192.168.174.202 node2.xx.com node2
关闭swap
注释掉/etc/fstab中swap那行,并重启主机生效
# /dev/mapper/centos-swap swap swap defaults 0 0
开启透明网桥
# echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
# echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
# systctl -p
什么是ipv4转发:出于安全考虑,Linux系统默认是禁止数据包转发的。转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
kube-proxy的ipvs模式和calico(都涉及路由转发)都需要主机开启ipv4转发。
另外,不使用k8s,即使只使用docker的时候,以下两种情况也依赖ipv4转发:
<1>当同一主机上的两个跨bridge(跨bridge相当于跨网段,跨网络需要路由)的容器互访
<2>从容器内访问外部
centos 7 系统从/usr/lib/sysctl.d/*.conf 和 /etc/sysctl.d/*.conf 加载应用系统配置,加载顺序根据*.conf的文件名确定
手动加载所有的配置文件,执行:
# sysctl --system
单独指定配置文件加载,执行:
# sysctl -p filename.conf
也可以直接通过sysctl工具配置值,执行:
# sysctl kernel.sysrq=1 (效果等同:# echo "1" > /proc/sys/kernel/sysrq)
配置docker yum仓库
# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装过程中主要做了以下几件事:
在/usr/bin/下生成docker可执行文件(docker、dockerd、containerd、runc等)
在/usr/lib/systemd/system下生成docker.service服务配置文件、docker.socket接口属性文件、containerd.service服务配置文件
在/etc/group中添加docker用户组
在/etc/containerd/下创建了config.toml文件
在/etc/docker下创建了key.json文件
在/etc/alternatives/下生成dockerd软链接文件(实际上是/usr/bin/dockerd软链接到/etc/alternatives/dockerd,再 由/etc/alternatives/dockerd链接回/usr/bin/docker-ce)
配置k8s yum仓库
# cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
gpgcheck=1
enabled=1
EOF
查看
yum list docker-ce --showduplicates | sort -r
yum list kubectl --showduplicates
安装 docker-ce 和kubectl
也可以安装指定的版本
sudo yum install docker-ce-18.06.1.ce
yum install docker-ce kubelet kubeadm kubectl
配置加速:
可选的很多
https://segmentfault.com/a/1190000020113347
https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.545.OY7haW
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
禁用 swap
swapoff -a
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
拉取 k8s 所需的镜像
脚本:
#!/bin/bash
# 下面的镜像应该去除"k8s.gcr.io/"的前缀,版本换成kubeadm config images list命令获取到的版本
images=(
kube-apiserver:v1.17.2
kube-controller-manager:v1.17.2
kube-scheduler:v1.17.2
kube-proxy:v1.17.2
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
初始化 kubeadmin
初始化kubeadm
错误处理文档:
[https://blog.csdn.net/cn_yaojin/article/details/100542508](https://blog.csdn.net/cn_yaojin/article/details/100542508)
[https://cloud.tencent.com/developer/article/1461571](https://cloud.tencent.com/developer/article/1461571)
我用的:
kubeadm init \
--apiserver-advertise-address=192.168.174.200 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.2 \
--service-cidr=10.1.0.0/16\
--pod-network-cidr=10.244.0.0/16
报错: 制定错了 --kubernetes-version v1.17.2 \ 导致多拉取了好多镜像,删除就好
docker rmi 7d54289267dc
docker rmi registry.aliyuncs.com/google_containers/etcd:3.4.3-0 :由于image id 相同,只有加上版本号删除才可以
报错: 删除相关文件和目录就好
[ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
[ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
[ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
示例:
kubeadm init \
--apiserver-advertise-address=master机器的ip \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
上面指定的参数都不能缺
–kubernetes-version: 用于指定k8s版本;
–apiserver-advertise-address:用于指定kube-apiserver监听的ip地址,就是 master本机IP地址。
–pod-network-cidr:用于指定Pod的网络范围; 10.244.0.0/16
–service-cidr:用于指定SVC的网络范围;
–image-repository: 指定阿里云镜像仓库地址
这一步很关键,由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址
注意:初始化时,留意输出的英文提示,可以及时知道初始化失败的原因,如下warning就是说主机名不对,找不到这个主机
初始化成功后提示:
To start using your cluster, you need to run the following as a regular user:
mkdir -p HOME/.kube/config
sudo chown (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.174.200:6443 --token f8drwf.46gfbuxuyb22wqei
--discovery-token-ca-cert-hash sha256:e938ffe0391185de31070da4c670397fa3b558a856586f2c3fd9a24db7a02cd3
忘记也是可以找到的
kubeadm token create --print-join-command