机器要求
单主集群一般用于开发环境,至少需要大于2台机器,一台作为主节点,其余的作为工作节点,机器间可以相互访问即可。
Hostname | Ip | Role |
---|---|---|
k8s-master | 192.168.122.2 | Master Node |
k8s-node-01 | 192.168.122.101 | Worker Node |
k8s-node-02 | 192.168.122.102 | Worker Node |
K8s-node-03 | 192.168.122.103 | Worker Node |
需要注意:
如果你使用的是云服务器,服务器只有一块网卡,外网IP通过弹性IP绑定,请不要使用公网IP,使用内网网卡绑定的IP来通信。原因是,k8s只会监听网卡绑定IP的端口。
安装准备
禁用Swap
k8s为了使容器的调度更符合机器的实际资源情况,k8s建议关闭内存交换swapoff -a
同时删除
/etc/fstab
中swap那条记录当然,如果你的机器资源确实不多,需要利用swap,那么你可以不关闭swap交换空间,通过如下参数告诉k8s开启swap
kubelet --fail-swap-on=false ...
关闭防火墙(开发环境)
Ubuntu
sudo ufw disable
CentOS
systemctl stop firewalld systemctl disable firewalld
禁用SELinux(开发环境)
sudo apt install selinux-utils setenforce 0
确认mac地址以及product uuid唯一
如果你的服务器是通过虚拟机克隆过来的,请确保这两项唯一ip link #检查mac地址 sudo cat /sys/class/dmi/id/product_uuid ##检查uuid
Docker安装(可选)
由于k8s需要安装指定docker18.06版本,所以如果你的版本不对,可以先卸载重新安装
sudo apt-get remove docker docker-engine docker-ce docker.io
安装docker
# 从 Ubuntu 的存储库安装 Docker:
apt-get update
apt-get install -y docker.io
# 或者从 Docker 的 Ubuntu 或 Debian 镜像仓库中安装 Docker CE 18.06:
## 安装环境准备。
apt-get update && apt-get install apt-transport-https ca-certificates curl software-properties-common
## 下载 GPG 密钥。
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
## 添加 docker apt 镜像仓库。
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
## 安装 docker。
apt-get update && apt-get install docker-ce=18.06.0~ce~3-0~ubuntu
# 设置守护进程。
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重启 docker。
systemctl daemon-reload
systemctl restart docker
开始安装 (切换到root身份)
安装相关工具
apt-get update && apt-get install -y apt-transport-https curl
添加k8s软件源
添加阿里源密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
添加k8s阿里源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF安装
kubelet
,kubeadm
,kubectl
apt-get update apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl非root用户需要加上sudo
部署master
初始化master节点
kubeadm init --apiserver-advertise-address=192.168.122.2 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
参数解释:
--apiserver-advertise-address
: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip--image-repository
: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。--pod-network-cidr
: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好--kubernetes-version
: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。--gnore-preflight-errors
: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用--ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。
执行上面的命令,等待安装完成,知道出现下面的文字表示安装成功
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(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.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
--discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12
复制保存kubeadm join
那行的文字,后面添加节点需要使用到,注意,token默认是24小时会过期,可以在master上利用如下命令查看token是否有效
kubeadm token list
如果没有有效token,可以重新创建一个
kubeadm token create
初始化kubectl工具
按照kubeadm的指示操作就行,依次执行如下命令,用普通用户的账号
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果你想在root用户下使用
export KUBECONFIG=/etc/kubernetes/admin.conf
部署flannel (Pod Network Adds-on)
k8s依赖于第三的节点网络,以便各pod节点之间可以相互通信
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
如果遇到timeout错误,请使用代理
输出以下内容代表安装完成
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created
添加node节点
按照最前面的部署安装好k8s相关程序
kubeadm join 192.168.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
--discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12
如果join命令忘记了复制,可以去master节点上执行
kubeadm token create --print-join-command
详细安装日志
可以通过在命令后面增加--v=5
来查看详细安装日志,例如
kubeadm join 192.168.122.2:6443 --token 1gyku3.72jgt8prrp2fdhhx \
--discovery-token-ca-cert-hash sha256:9c5bf462c308be3a69b6766e71f367e48e222c4ee019c4ec438e02e089ab4e12 --v=5
安装完成
主节点执行kubectl get nodes -o wide
,检查各节点是否为Ready状态
ubuntu@k8s-master:~$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready master 23d v1.16.2 192.168.122.2 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://18.6.0
k8s-node-01 Ready <none> 23d v1.16.2 192.168.122.101 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://18.6.0
k8s-node-02 Ready <none> 23d v1.16.2 192.168.122.102 <none> Ubuntu 16.04.6 LTS 4.4.0-142-generic docker://18.6.0