一、主机、IP规划和网络规划
主机名 | 操作系统 | IP地址 |
---|---|---|
manager | Centos 7.4-x86_64 | 192.168.77.129 |
node2 | Centos 7.4-x86_64 | 192.168.77.128 |
node1 | Centos 7.4-x86_64 | 192.168.77.132 |
二 、防火墙和selinux设置
所有节点操作
[root@manager ~]# systemctl stop firewalld
[root@manager ~]# systemctl disable firewalld
[root@manager ~]# sed -i "s/^SELINUX\=enforcing/SELINUX\=disabled/g" /etc/selinux/config
[root@manager ~]# setenforce 0
三、内核参数开启
所有节点操作
[root@manager ~]# echo "net.bridge.bridge-nf-call-ip6tables = 1" >>/etc/sysctl.conf
[root@manager ~]# echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
[root@manager ~]# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
[root@manager ~]# sysctl -p
# 加载模块
[root@manager ~]# modprobe br_netfilter
[root@manager ~]# echo "modprobe br_netfilter" >> /etc/rc.local
# 再次重载下
[root@manager ~]# sysctl -p
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 关闭swap
[root@manager ~]# swapoff -a
[root@manager ~]# echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
三、 安装kubectl,kubeadm,kubelet
kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。
官网地址:https://www.kubernetes.org.cn/installkubectl
Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。
kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是之前的节点准备工作。
官网地址:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
kubelet 是在每个节点上运行的主要 “节点代理”。kubelet 以 PodSpec 为单位来运行任务,PodSpec 是一个描述 pod 的 YAML 或 JSON 对象。 kubelet 运行多种机制(主要通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpecs 中描述的容器健康运行。 不是 Kubernetes 创建的容器将不在 kubelet 的管理范围。
官网地址:https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
- 仓库准备
所有节点操作
# 下载base,epel
[root@manager ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 2773 0 --:--:-- --:--:-- --:--:-- 2772
[root@manager ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@manager ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.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
EOF
- 安装k8s
所有节点操作
[root@manager ~]# yum install kubelet kubeadm kubectl
[root@manager ~]# systemctl enable docker && systemctl restart docker
[root@manager ~]# systemctl enable kubelet && systemctl start kubelet
# docker加速配置
[root@manager ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"exec-opts":["native.cgroupdriver=systemd"]
}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
# 重新加载配置
[root@manager ~]# sudo systemctl daemon-reload
# 启动docker
[root@manager ~]# sudo systemctl restart docker
# 开启自启动
[root@manager ~]# systemctl enable docker
- 初始化k8s管理节点
在k8s-master上安装管理节点:
# 查看需要的镜像版本
[root@node2 ~]# kubeadm config images list
W1019 14:13:50.371886 48135 version.go:101] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
W1019 14:13:50.372234 48135 version.go:102] falling back to the local client version: v1.16.2
k8s.gcr.io/kube-apiserver:v1.16.2
k8s.gcr.io/kube-controller-manager:v1.16.2
k8s.gcr.io/kube-scheduler:v1.16.2
k8s.gcr.io/kube-proxy:v1.16.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.15-0
k8s.gcr.io/coredns:1.6.2
# 根据需要的版本,直接拉取国内镜像,并修改tag
[root@manager ~]# vi kubeadm.sh
脚本内容:
#!/bin/bash
## 使用如下脚本下载国内镜像,并修改tag为google的tag
set -e
KUBE_VERSION=v1.16.2
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.15-0
CORE_DNS_VERSION=1.6.2
GCR_URL=k8s.gcr.io
ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
images=(kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns:${CORE_DNS_VERSION})
for imageName in ${images[@]} ; do
docker pull $ALIYUN_URL/$imageName
docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done
# 运行脚本,拉取镜像
[root@manager ~]# sh ./kubeadm.sh
# master节点执行
[root@manager ~]# sudo kubeadm init --apiserver-advertise-address 192.168.77.129 --kubernetes-version=v1.16.2 --pod-network-cidr=10.244.0.0/16
kubelet每隔几秒钟重新启动一次,因为它在崩溃循环中等待kubeadm告诉它该怎么做。 此崩溃循环是正常现象,请继续进行下一步,并且kubelet将开始正常运行。
初始化 root 用户的 kubectl 配置
[root@manager ~]# mkdir -p $HOME/.kube
[root@manager ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@manager ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
附:
如果是要安装多个master节点,则初始化命令使用
kubeadm init --apiserver-advertise-address 192.168.77.129 --control-plane-endpoint 192.168.77.128 --kubernetes-version=v1.16.2 --pod-network-cidr=10.244.0.0/16 --upload-certs
(工作节点)加入master节点:
kubeadm join 192.168.77.129:6443 --token z34zii.ur84appk8h9r3yik --discovery-token-ca-cert-hash sha256:dae426820f2c6073763a3697abeb14d8418c9268288e37b8fc25674153702801 --control-plane --certificate-key 1b9b0f1fdc0959a9decef7d812a2f606faf69ca44ca24d2e557b3ea81f415afe
4. 初始化k8s工作节点
# 拷贝结果,在两个工作结点运行
[root@node2 ~]# kubeadm join 192.168.77.129:6443 --token rnis66.kis43089mofbcq6c \
--discovery-token-ca-cert-hash sha256:c6e0b85f168a1cce564cc912d1b7b8052436a759b277837f199c6162f222d645
如果添加节点失败,或是想重新添加,可以使用命令:
[root@node1 ~]# kubeadm reset
注:不要在轻易master上使用,它会删除所有kubeadm配置
如果在管理节点重置后,需通重新初始化。
5. 查看状态
[root@manager ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
manager NotReady master 12m v1.16.2
node1 NotReady <none> 34s v1.16.2
node2 NotReady <none> 86s v1.16.2
但节点的状态就是 NotReady。
1)在master上操作,拷贝配置,使kubectl可用
# 初始化 root 用户的 kubectl 配置
[root@manager ~]# mkdir -p $HOME/.kube
[root@manager ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@manager ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
2)下载flannel配置文件
[root@manager ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
因为kube-flannel.yml文件中使用的镜像为quay.io的,国内无法拉取,所以同样的先从国内源上下载,修改tag,脚本如下:
[root@manager ~]# vi flanneld.sh
#!/bin/bash
set -e
FLANNEL_VERSION=v0.11.0
# 在这里修改源
QUAY_URL=quay.io/coreos
QINIU_URL=quay-mirror.qiniu.com/coreos
images=(flannel:${FLANNEL_VERSION}-amd64
flannel:${FLANNEL_VERSION}-arm64
flannel:${FLANNEL_VERSION}-arm
flannel:${FLANNEL_VERSION}-ppc64le
flannel:${FLANNEL_VERSION}-s390x)
for imageName in ${images[@]} ; do
docker pull $QINIU_URL/$imageName
docker tag $QINIU_URL/$imageName $QUAY_URL/$imageName
docker rmi $QINIU_URL/$imageName
done
运行脚本,这个脚本需要在每个节点上执行:
[root@node1 ~]# sh flanneld.sh
3) 安装flanneld(所有节点)
# 重置后,需要在主节点上再次执行
[root@manager ~]# kubectl apply -f kube-flannel.yml
flanneld默认安装在kube-system Namespace中,使用以下命令查看:
[root@manager ~]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
coredns-5644d7b6d9-qkcpj 1/1 Running 0 56m
coredns-5644d7b6d9-wxxd9 0/1 Running 0 56m
etcd-manager 1/1 Running 0 55m
kube-apiserver-manager 1/1 Running 0 55m
kube-controller-manager-manager 1/1 Running 0 55m
kube-flannel-ds-amd64-q24dk 0/1 Init:0/1 0 22s
kube-flannel-ds-amd64-r9b8d 0/1 Init:0/1 0 22s
kube-flannel-ds-amd64-rwxpg 1/1 Running 0 22s
kube-proxy-2dg6l 0/1 ContainerCreating 0 46m
kube-proxy-7cc6b 0/1 ContainerCreating 0 45m
kube-proxy-8rlhn 1/1 Running 0 56m
kube-scheduler-manager 1/1 Running 0 55m
出现错误,原因是两个工作节点不能拉取pause和kube-proxy镜像,可以直接从master上打包,在node上使用:
## master上执行
[root@node1 ~]# docker save -o pause.tar k8s.gcr.io/pause:3.1
[root@node1 ~]# docker save -o kube-proxy.tar k8s.gcr.io/kube-proxy
## 分发文件到两个节点
[root@manager ~]# scp pause.tar root@192.168.77.132:/root/
[root@manager ~]# scp kube-proxy.tar root@192.168.77.128:/root/
## node上执行,必须
[root@node1 ~]# docker load -i pause.tar
[root@node1 ~]# docker load -i kube-proxy.tar
# 再次查看集群节点
[root@manager ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
manager Ready master 69m v1.16.2
node1 Ready <none> 57m v1.16.2
node2 Ready <none> 58m v1.16.2
附:
重新安装flanneld
## 如果之前安装了,先删除
kubectl delete -f kube-flannel.yml
kubectl create -f kube-flannel.yml
四、常见问题:
- Cannot connect to the Docker daemon at tcp://0.0.0.0:2375. Is the docker daemon running?
解决:
[root@node1 ~]# vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
必须将CPU个数设置为2。[ERROR Swap]: running with swap on is not supported. Please disable swap
需禁用交换分区。
解决:
[root@manager ~]# swapoff -a
[root@manager ~]# echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
检测到“cgroupfs”作为Docker cgroup驱动程序。 推荐的驱动程序是“systemd”。
解决:
vi /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
- [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.16.2: output: Error response
原因:
无法下载镜像。
解决:
https://hub.docker.com/,然后搜索kube-apiserver-amd64
[root@manager ~]# docker pull pigletfly/kube-apiserver-amd64
- Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
重置kubectl:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Kubernetes pod状态出现ImagePullBackOff的原因
The connection to the server localhost:8080 was refused - did you specify the right host or port?
kubeadm搭建完环境之后会删除work节点上的admin.conf的认证配置文件,如果需要在work节点上使用kubectl查询资源,需要将master节点的admin.conf 拷贝到work节点:
在集群配置时,默认会生成kubernetes-admin这个用户及相关公私钥和证书,证书信息保存在master节点的配置文件/etc/kubernetes/admin.conf中。