使用 Kubeadm 在服务器安装单节点 K8s 集群

环境:阿里云服务器,Ubuntu16.04, 2核8G

安装 ALL-In-One 的 Kubernetes 集群

1.安装Docker

1
2
3
4
5
6
7
8
9
apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io

# 测试 docker 是否可以使用,版本:19.03.1
docker version

2.配置内核模块(kube-proxy ipvs 模式需要使用)和内核参数,并关闭 swapoff

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim /etc/modules
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
br_netfilter

vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

3.安装 kubeadm、kubelet、kubectl、ipvsadm 和 ipset

当 kube-proxy 允许在 ipvs 模式下运行时,可以通过 ipvsadm 工具查看各种规则。

1
2
3
4
5
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
vim /etc/apt/sources.list.d/aliyun-k8s.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
apt update
apt install -y kubeadm kubelet kubectl ipvsadm ipset

4.配置 Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /etc/docker/daemon.json 
{
"registry-mirrors": ["https://n6syp70m.mirror.aliyuncs.com"],
"iptables": false,
"ip-masq": false,
"storage-driver": "overlay2",
"exec-opts": ["native.cgrounpdriver=systemd"],
"log-driver": "json-file",
"log-opts": { "max-size": "20m" }
}

# 重启
reboot

5.使用 kubeadm 初始化集群,同时指定 pod 网段为 flannel 网络插件的默认网段

如果有更多的节点要加入到 Kubernetes 集群,那么需要在每个节点上依次执行上面的 1-4 个步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

...
...
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 172.16.128.59:6443 --token 02ct9e.19dxnkc43n6bzvu2 \
--discovery-token-ca-cert-hash sha256:d1a7ec1dc24f0a3ba86e5b9f373df19df0ab742f9b59846c91013c715d935fa5

6.复制 kubectl 相关配置文件

1
2
3
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

7.验证集群启动成功

1
2
3
4
5
6
7
8
9
10
11
12
13
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
izbp13yx4795aofieb7vatz NotReady master 3m46s v1.15.3

$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-bccdc95cf-6cxqt 0/1 Pending 0 7m21s
coredns-bccdc95cf-jmsvj 0/1 Pending 0 7m21s
etcd-izbp13yx4795aofieb7vatz 1/1 Running 0 6m27s
kube-apiserver-izbp13yx4795aofieb7vatz 1/1 Running 0 6m21s
kube-controller-manager-izbp13yx4795aofieb7vatz 1/1 Running 0 6m37s
kube-proxy-r75xw 1/1 Running 0 7m21s
kube-scheduler-izbp13yx4795aofieb7vatz 1/1 Running 0 6m42s

可以发现 coredns pod 还处于 Pending 状态,这是由于网络插件还未安装。

8.安装网络插件 flannel

由于 flannel 使用的镜像默认托管在 quay.io 上,但国内访问速度会特别慢,所以可以先通过其他渠道将镜像拉取到本地,避免后续部署失败。在从 mirror 拉取镜像时,需要先看下 flannel.yaml 文件中指定的镜像版本是什么,比如这次使用的是 quay.io/coreos/flannel:v0.11.0-amd64,所以可以先通过以下命令拉取镜像:

1
2
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
docker tag quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64

部署 flannel:

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

此时可以再次执行 kubectl get pod -n kube-system 验证网络插件是否部署成功,可以看到 coredns pod 已经变为 running 状态。

9.移除 master 节点的 taint

kubeadm 在 Master 上也安装了 kubelet,在默认情况下不参与工作负载,这里我们是安装一个单机 ALL-In-One 的 Kubernetes 环境,可以执行下面的命令让 Master 成为一个 Node。

1
2
3
4
kubectl get nodes #获取到 Master 节点的名称,这里为 izbp13yx4795aofieb7vatz

# 大家用自己环境中的 Master 节点名称替换下面命令的 izbp13yx4795aofieb7vatz
kubectl taint nodes izbp13yx4795aofieb7vatz node-role.kubernetes.io/master-

部署 Nginx 验证集群

通过部署 Nginx 验证集群

1
2
kubectl create deployment nginx --image=nginx
kubectl expose deploy nginx --type=NodePort --port=8080 --target-port=80 --name=nginx-svc

通过下面的命令查看创建的 pod、deployment 以及 service:

1
2
3
4
5
6
7
8
9
10
11
12
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-554b9c67f9-qszt2 1/1 Running 0 2m1s

$ kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 2m10s

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 20m
nginx-svc NodePort 10.104.212.181 <none> 8080:30722/TCP 44s

可以发现 nginx 服务暴露在集群 IP 10.104.212.181 的 8080 端口上,下面在节点上使用 curl 可以访问到 nginx:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ curl 10.104.212.181:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
....
打赏

请我喝杯咖啡吧~

支付宝
微信