主机----虚拟机----容器docker(轻量级虚拟机)
一、Docker三剑客
- docker machine: 部署主机
- docker compose:通过文件在主机中运行多个APP
- docker swarm:容器编排工具,管理主机集群
mesos+marathon
mesos:管理IDC主机机房
marathon:容器的部署和管理
二、docker和kubernetes关系:
kubernetes(谷歌公司内部用,14年开源,16年云原生计算基金会)
docker:一家小公司的开源软件,后来原生支持kubernetes
三、 k8s对node和pod的支持
Node:2000台 pod:150000个
Master node和worker node
Master node:集群管理者
Worker node:提供应用运行的相关工作
四、修改主机名解析(IP与主机名对应关系)
修改主机名
1、方法一使用hostnamectl命令
[[email protected] ~]# hostnamectl set-hostname <Newname>
2、方法二:修改配置文件 /etc/hostname 保存退出
[[email protected] ~]# vi /etc/hostname
<Newname>
[[email protected] ~]#vim /etc/hosts
内容:192.168.154.100 master1
192.168.154.101 worker1
192.168.154.102 worker2
五、关闭防火墙
1、[[email protected] ~]# service firewall stop
2、[[email protected] ~]# systemctl disable fire
六、关闭seLinux
[[email protected] ~]# sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
七、安装、配置时间同步
安装:[[email protected] ~]# yum -y install ntpdate
配置:[[email protected] ~]# crontab –e 内容:0 */1 * * * ntpdate time1.aliyun.com
手动:[[email protected] ~]# ntpdate time1.aliyun.com
八、关闭交换分区fstab(不关,装k8s会报错)
[[email protected] ~]# vim /etc/fstab (注释掉fstab)
内容:#/dev/mapper/centos-swap swap swap defaults 0 0
九、配置网桥过滤
[[email protected] ~]# vim /etc/sysctl.d/k8s.conf
内容:net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
加载模块:[[email protected] ~]# modprobe br_netfilter
查看是否加载:[[email protected] ~]# lsmod | grep br_netfilter
加载网桥过滤配置文件:sysctl -p /etc/sysctl.d/k8s.conf显示有内容说明已经配置到内核了
十、开启ipvs
1、安装ipset和ipvsadm
[[email protected] ~]# yum -y install ipset ipvsadm
2、加载模块
[[email protected] ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
加权限然后用sh执行:
[[email protected] ~]# ll /etc/sysconfig/modules/
[[email protected] ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[[email protected] ~]# sh /etc/sysconfig/modules/ipvs.modules
检查加载情况:[[email protected] ~]# lsmod | grep ip_vs_rr
十一、安装docker-ce(k8s只能管理到pos节点,pos里包含docker,所以要借助docker-ce来完成管理)
- yum源获取
[[email protected]~]# wget -o /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
查看是否成功:ls /etc/yum.repos.d/
PS:插入一个问题
做完第1步以后,第2步yum提示找不到源Error: File contains no section headers
解决办法:
[[email protected] ~]# yum install -y yum-utils
[[email protected] ~]# yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
- 查看、安装和验证docker-ce
查看:[[email protected] ~]# yum list docker-ce.x86_64 --showduplicates | sort -r (导入GPG的时候要输入y回车)
安装:[[email protected] ~]# yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
验证:[[email protected] ~]# docker version
十二、设置开机自启动和开启docker-ce
开机启动:systemctl enable docker.service
启动:systemctl start docker.service
如果想用第三方插件或者其他版本
要修改:[[email protected] ~]# vim /usr/lib/systemd/system/docker.service
修改内容1:[Service]
Type=notify
ExecStart=/usr/bin/dockerd (如果原文有-H选项,删除-H和后面所以内容)
修改内容2:[[email protected] ~]# vim /etc/docker/daemon.json #添加驱动
{
"exec-opts":["native.cgroupdriver=systemd"]
}
十三、安装k8s软件kubeadm、kubelet、kubectl
1、添加k8s.repo源
[[email protected] ~]# vim /etc/yum.repos.d/k8s.repo
内容:[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
必须空格https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
linux系统下用scp命令互传文件
[[email protected] ~]# scp /etc/yum.repos.d/k8s.repo worker2:/etc/yum.repos.d/
2、安装:kubeadm、kubelet、kubectl
[[email protected] ~]# yum list | grep kubeadm (会提示导入key,输入y然后在打一次同样的命令)
查版本:[[email protected] ~]# yum list kubeadm.x86_64 --showduplicates | sort -r
安装: [[email protected] ~]# yum -y install --setopt=obsoletes=0 kubeadm-版本号 kubelet-版本号kubectl-版本号 (可以不加版本号,默认安装最新版本)rpm --import /etc/pki/rpm-gpg/RPM*
Ps: [[email protected] ~]# vim /etc/yum.repos.d/k8s.repo这里面的gpgkey下面的连接必须空格,不然会报错:安装获取 GPG **失败:[Errno 14] HTTPS Error 404 - Not Found
- kubelet配置
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性
建议修改:[[email protected] ~]# vim /etc/sysconfig/kubelet
内容:KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”
然后设置开机启动:systemctl enable kubelet.service
十四、k8s初始化(kubeadm对k8s进行初始化时,集群组件是以容器的方式进行)
- 准备k8s集群容器镜像(俗称:拉镜像,可以从国外或国内拉)
- 查看需要使用的镜像都有哪些:
[[email protected] ~]#kubeadm config images list
- 列出镜像列表到文件,便于下载使用:
[[email protected] ~]#kubeadm config images list >>image.list (把需要的镜像导出到列表)
- 查看已列出镜像文件列表:
[[email protected] ~]# cat image.list
[[email protected] ~]# vim image.list (编辑image.list添加如下内容,作用:下载镜像)
#!/bin/bash
img_list='
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
'
for img in ${img_list}
do
docker pull $img
done
执行任务:[[email protected] ~]# sh image.list
查看下载结果:docker images
PS:如果上面的链接无效的话要另外找!
-
- 下载完后要改标签:连续执行命令
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2 k8s.gcr.io/kube-apiserver:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2 k8s.gcr.io/kube-controller-manager:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2 k8s.gcr.io/kube-scheduler:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2 k8s.gcr.io/kube-proxy:v1.18.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0 && docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
-
- 连续执行命令(删除镜像):
有三种方式:分号 ; 和 && 和 ||
分号是不论对错都执行,&&遇到执行失败的命令停止,||遇到执行成功的命令就停止,两命令之间要留空格
docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.18.2 && docker image rm registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.18.2
-
- Worker节点只需要k8s.gcr.io/kube-proxy:v1.18.2和k8s.gcr.io/pause:3.2
把这两个镜像传到worker1和worker2节点上
[[email protected] ~]# docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy:v1.18.2
[[email protected] ~]# docker save -o pause.tar k8s.gcr.io/pause:3.2
[[email protected] ~]# scp kube-proxy.tar pause.tar worker1:/root
[[email protected] ~]# scp kube-proxy.tar pause.tar worker2:/root
⑤ 在worker1和worker2导入镜像
[[email protected] ~]# docker load -i kube-proxy.tar
[[email protected] ~]# docker load -i pause.tar
⑥备份镜像(方便传到node节点上用)
[[email protected] ~]#docker save k8s.gcr.io/kube-proxy:v1.18.5 \
k8s.gcr.io/kube-apiserver:v1.18.5 \
k8s.gcr.io/kube-controller-manager:v1.18.5 \
k8s.gcr.io/kube-scheduler:v1.18.5 \
k8s.gcr.io/pause:3.2 \
k8s.gcr.io/coredns:1.6.7 \
k8s.gcr.io/etcd:3.4.3-0 > k8s-imagesV1.18.5.tar
- K8s涉及三层网络:节点网络,集群网络,pod网络
kubenets初始化:kubeadm init --kubernetes-version=v1.18.2 --pod-network-cidr=172.16.0.0/16 --apiserver-advertise-address=192.168.154.100 (绿色为pod网络,黄色为节点网络)
插入一个重要错误:
报错: [kubelet-check] Initial timeout of 40s passed.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused.
排查:[[email protected] ~]# journalctl -xefu kubelet
原因:7月 10 16:55:08 master1 kubelet[13638]: F0710 16:55:08.957443 13638 server.go:164] unknown command: ”--cgroup-driver=systemd”
(回滚到十三的第3点,添加的KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”不能被识别,导致docker的cgroup和kubelet的cgroup不一致,kubelet启动不成功)
解决:1、把KUBELET_EXTRA_ARGS=”--cgroup-driver=systemd”删掉
2、在[[email protected] ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
添加内容:Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"
ExecStart=/usr/bin/kubelet $KUBELET_CONFIG_ARGS
拓展说明:vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf这个文件是kubelet的运行配置文件(正常来说:文件上半部分的Environent=有几个ARGS,下面的ExecStart=就会有几个),这个文件配的不正确会导致kubelet平台启动不成功,另外,kubelet是通过kubeadm init 或者kubeadm join等操作来启动的,而不是手动启动,手动启动的只有kubelet的主进程,运行状态会显示为:active(auto-reset)正常是active(running)
处理上面的错误后,初始化成功,然后进行:为日常使用集群的用户添加kubectl使用权限
[[email protected] ~]# mkdir -p $HOME/.kube
[[email protected] ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[[email protected] ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
十五、网络配置(两种)
1、使用flannel搭建overlay型网络
#下载flannel最新配置文件:[[email protected] ~]# yum install -y wget
下载kube-flannel:[[email protected] ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安装kube-flannel:[[email protected] ~]# kubectl apply -f kube-flannel.yml
查看nodes状态:[[email protected] ~]# kubectl get nodes
如果STATUS提示NotReady,可以通过 kubectl describe node kube-master 查看具体的描述信息,性能差的服务器到达Ready状态时间会长些
2、使用calico搭建非overlay型网络
首先,要想办法拿到calico的镜像,两种办法:
- 在CSDN等网站手动下载calico的镜像,然后用docker load –i导入到节点
- 找到可以拉取镜像的连接,用docker pull拉镜像。
拓展说明:Overlay网络需要封包和解包,理论上要比非overlay要多占用资源,速度也就慢。
十六、把worker添加到master
- 在worker节点申请添加到master上来
[[email protected] ~]# kubeadm join 192.168.154.100:6443 --token zrwawn.oibshx46mc9vi225 \
--discovery-token-ca-cert-hash sha256:dab8291d5e508c74841ee400922280dd72e5e56170114dd4d08c0e6e4aa2a59f
4、如果kube-master初始化的时候不记得token,可以新申请创建一个:
[[email protected] ~]#kubeadm token create --print-join-command
PS:好像token是有有效期的,过一段时间就不能用了。
3和4点问题很多:大多都是node节点加不上master,老以为是因为kubelet没有启动造成,其实是vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf文件没有配置正确,可以回到上面的十四点的(4)看看。
主要解决办法:
①vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf这个文件正常来说:文件上半部分的Environent=有几个ARGS,下面的ExecStart=就会有几个
②把docker 的cgroupfs和kubelet的cgroupfs设置为一样的systemd。
最后补充一个节点Joni错误:
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "8l6t3i"
初步判断是token的问题,但是重启后又能正常join了。奇怪!