操作系统: Ubuntu 18.10
(本教程采用server版本)
Docker: docker-ce 18.06
Kubernetes: k8s 1.13.1
我们直接下载Unbuntu18.10-server版本,server版本的好处是没有Desktop,可以节省资源。
wget http://mirrors.aliyun.com/ubuntu-releases/18.10/ubuntu-18.10-live-server-amd64.iso
我这里选择1,结果后面在安装的时候就会报
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
设置国内镜像源头 http://mirrors.aliyun.com/ubuntu/
注意末尾的斜线,我这里居然忘记添加末尾的斜线,不过貌似没啥问题?最好还是加上末尾的斜线吧。
切勿选择 microk8s snap
stable: v1.14.2
空格选中
YOUR_USERNAME
密码: YOUR_PASSWORD
YOUR_USERNAME
密码: YOUR_PASSWORD
sudo passwd
输入上面的YOUR_PASSWORD
,然后输入root用户的密码root
设置root用户的密码root,是为了教学过程中简单。
但是在生产环境下禁止使用弱强度的密码。
exit
退出当前登录用户,然后使用root用户重新登录shutdown now
停机修改主机名称
vim /etc/cloud/cloud.cfg
preserve_hostname: true
$ shutdown -r now
使用root用户登录
打开hosts文件 vim /etc/hosts
输入如下内容
192.168.236.177 master
这个ip是当前桥接或者NAT分配的IP地址
重启机器shutdown -r now
$netplan apply
uname -r
4.18.0-21-generic(主版本必须保持一致)
curl
首先切换root用户
apt-get update && apt-get install -y curl telnet wget man apt-transport-https ca-certificates software-properties-common vim
$ lsb_release -c
Codename: cosmic
(建议下面的手动安装方式,因为在线可能会出现版本不一致)
注意: 该国内源目前提供的版本,与k8s不符。k8s推荐安装Docker ce 18.06
$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加国内源头
$ sudo add-apt-repository "deb https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
$ apt update
3.安装查看版本指令
$ apt-get install -y apt-show-versions
4.查看docker-ce版本号
$ apt-show-versions -a docker-ce
Docker-ce
$ sudo apt-get update && apt-get install -y docker-ce
docker-ce_18.06.1\~ce\~3-0\~ubuntu_amd64.deb
master
dpkg -i docker-ce_18.06.1\~ce\~3-0\~ubuntu_amd64.deb
如果提示错误
dpkg: error: dpkg frontend is locked by another process
说明已经有其他进程在使用dpkg安装程序
sudo rm /var/lib/dpkg/lock
即可。
如果提示错误
root@master:/home/master# dpkg -i docker-ce_18.06.1\~ce\~3-0\~ubuntu_amd64.deb
Selecting previously unselected package docker-ce.
(Reading database ... 100354 files and directories currently installed.)
Preparing to unpack docker-ce_18.06.1~ce~3-0~ubuntu_amd64.deb ...
Unpacking docker-ce (18.06.1~ce~3-0~ubuntu) ...
dpkg: dependency problems prevent configuration of docker-ce:
docker-ce depends on libltdl7 (>= 2.4.6); however:
Package libltdl7 is not installed.
dpkg: error processing package docker-ce (--install):
dependency problems - leaving unconfigured
Processing triggers for man-db (2.8.4-2) ...
Processing triggers for systemd (239-7ubuntu10.12) ...
Errors were encountered while processing:
docker-ce
root@master:/home/master#
表示当前docker-ce 依赖系统libltd17库,安装就可以了
$ apt-get install -y libltdl7
docker version
确保版本号是 18.06
sudo systemctl enable docker
sudo systemctl start docker
docker
已经运行 sudo docker ps
发现报如下错误:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied
我们需要将当前的普通用户添加到当前的docker用户组中
sudo groupadd docker
sudo usermod -aG docker $USER
exit
就可以使用了。
Alpine
镜像热身一下 Docker
~$ sudo docker run -it --rm alpine:latest sh
输出内容如下,我们在Docker
容器中测试三个命令,分别是
- `date`
- `time`
- `uname -r`
申请步骤如下
在阿里云注册自己账户
找到容器镜像服务,参考网址如下
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
点开左侧菜单镜像中心—>镜像加速器
右侧加速器地址,即使私人专属的镜像加速器地址,点击复制
目的 : 为了下载docker镜像更快
您可以通过修改daemon
配置文件/etc/docker/daemon.json
来使用加速器。
创建/etc/docker/daemon.json
文件,内容如下:
{
"registry-mirrors": ["https://xxxxxxx.mirror.aliyuncs.com"]
}
重启docker服务
# 重载所有修改过的配置文件
sudo systemctl daemon-reload
# 重启Docker服务
sudo systemctl restart docker
建议在安装的过程中,保存虚拟机的快照,这样防止误操作导致环境崩坏。
创建配置文件sudo touch /etc/apt/sources.list.d/kubernetes.list
添加写权限
$ sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list
再添加,内容如下:
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
root@master:/home/master# vim /etc/apt/sources.list.d/kubernetes.list
root@master:/home/master# sudo apt update
Get:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease
Err:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease
Reading package lists... Done
W: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
E: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
root@master:/home/master#
其中:
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
签名认证失败,需要重新生成。记住上面的NO_PUBKEY 6A030B21BA07F4FB
添加认证key
运行如下命令,添加错误中对应的key(错误中NO_PUBKEY后面的key的后8位)
gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB
接着运行如下命令,确认看到OK,说明成功,之后进行安装:
gpg --export --armor BA07F4FB | sudo apt-key add -
sudo apt update
更新系统下载源数据列表root@master:/home/master# su master
master@master:~$ sudo apt update
[sudo] password for master:
Get:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease
Ign:3 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages
Get:3 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages [28.4 kB]
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease
Hit:6 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease
Fetched 28.4 kB in 1s (44.9 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
92 packages can be upgraded. Run 'apt list --upgradable' to see them.
master@master:~$
以上没有报和错误异常,表示成功。
$ sudo ufw disable
Firewall stopped and disabled on system startup
master@master:~$ top
master@master:~$ top
top - 13:16:35 up 32 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 160 total, 1 running, 159 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1969.9 total, 1126.7 free, 253.8 used, 589.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1564.0 avail Mem
# 成功(临时关闭)
$ sudo swapoff -a
# 永久关闭swap分区
$ sudo sed -i 's/.*swap.*/#&/' /etc/fstab
或者可以
sudo vim /etc/fstab
然后重启之后查看
# 安装操控selinux的命令
$ sudo apt install -y selinux-utils
# 禁止selinux
$ setenforce 0
# 重启操作系统
$ shutdown -r now
# 查看selinux是否已经关闭
$ sudo getenforce
Disabled(表示已经关闭)
重启之后查看
(1) 配置内核参数,将桥接的IPv4流量传递到iptables的链
创建/etc/sysctl.d/k8s.conf
文件
添加内容如下:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0
(2) 执行命令使修改生效
# 【候选】建议执行下面的命令
$ sudo modprobe br_netfilter
$ sudo sysctl -p /etc/sysctl.d/k8s.conf
注意: 切换到root用户
$ su
v1.13.1
$ apt update && apt-get install -y kubelet=1.13.1-00 kubernetes-cni=0.6.0-00 kubeadm=1.13.1-00 kubectl=1.13.1-00
$ sudo systemctl enable kubelet && systemctl start kubelet
$ sudo shutdown -r now
使用root用户登录Master
主机
执行如下个命令
kubectl get nodes
输出如下
$ kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
node1-k8s
和node2-k8s
分别对两个完整克隆的虚拟机进行如下操作,修改主机名称
修改/etc/hostname
,只有一行 node1
或node2
node1
主机
sudo vim /etc/hostname
node2
主机
sudo vim /etc/hostname
/etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
addresses: [192.168.174.133/24]
dhcp4: false
gateway4: 192.168.174.2
nameservers:
addresses: [192.168.174.2]
optional: true
version: 2
重启ip配置
sudo netplan apply
/etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
addresses: [192.168.174.134/24]
dhcp4: false
gateway4: 192.168.174.2
nameservers:
addresses: [192.168.174.2]
optional: true
version: 2
sudo netplan apply
/etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
addresses: [192.168.174.135/24]
dhcp4: false
gateway4: 192.168.174.2
nameservers:
addresses: [192.168.174.2]
optional: true
version: 2
重启ip配置
sudo netplan apply
注意: (Master、Node1、Node2都需要配置)
使用root用户登录
打开hosts文件 vim /etc/hosts
输入如下内容
192.168.174.133 master
192.168.174.134 node1
192.168.174.135 node2
shutdown -r now
$ sudo mkdir /home/master/working
$ cd /home/master/working/
kubeadm
对应的配置文件,之后操作在home/master/working/
目录下使用kubeadm配置文件,通过在配置文件中指定docker仓库地址,便于内网快速部署。
切换root用户,然后生成配置文件
kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
kubeadm.conf
中的如下两项:vi kubeadm.conf
# 修改 imageRepository: k8s.gcr.io
# 改为 registry.cn-beijing.aliyuncs.com/imcto
imageRepository: registry.cn-beijing.aliyuncs.com/imcto
# 修改kubernetes版本kubernetesVersion: v1.13.0
# 改为kubernetesVersion: v1.13.1
kubernetesVersion: v1.13.1
3. 修改kubeadm.conf
中的API服务器地址,后面会频繁使用这个地址。
localAPIEndpoint:
advertiseAddress: 192.168.174.133
bindPort: 6443
注意:
192.168.174.133
是master主机的ip地址
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
这里的10.244.0.0/16
和 10.96.0.0/12
分别是k8s内部pods和services的子网网络,最好使用这个地址,后续flannel网络需要用到。
$ kubeadm config images list --config kubeadm.conf
registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/pause:3.1
registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24
registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6
#下载全部当前版本的k8s所关联的镜像
kubeadm config images pull --config ./kubeadm.conf
#初始化并且启动
$ sudo kubeadm init --config ./kubeadm.conf
结果发现报了如下错误:
root@master:/home/master/working# sudo kubeadm init --config ./kubeadm.conf
[init] Using Kubernetes version: v1.13.1
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
所以一开始的虚拟机CPU的处理器数量要选择2。我们重新对master和node1和node2进行设置。
更多kubeadm配置文件参数详见
kubeadm config print-defaults
然后我们设置完毕之后重新执行命令
$ sudo kubeadm init --config ./kubeadm.conf
k8s启动成功输出内容较多,但是记住末尾的内容
Your Kubernetes master 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/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 192.168.174.133:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:8476ea088b475863dfa5a8a642ae3bc3db5df32b3b8b5526f777d411397b8bb7
按照官方提示,执行以下操作。
切换到普通的master用户
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 启动kubelet 设置为开机自启动
$ sudo systemctl enable kubelet
# 启动k8s服务程序
$ sudo systemctl start kubelet
NotReady
,证明初始化服务器成功$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 12m v1.13.1
$ kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health": "true"}
目前只有一个master,还没有node,而且是NotReady状态,那么我们需要将node加入到master管理的集群中来。在加入之前,我们需要先配置k8s集群的内部通信网络,这里采用的是flannel网络。
$cd $HOME/working
$sudo wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
编辑这个文件,确保flannel网络是对的,找到net-conf.json
标记的内容是否正确。
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
这个"10.244.0.0/16"和 ./kubeadm.conf中的podsubnet的地址要一致。
应用当前flannel配置文件
master@master:~/working$ sudo kubectl apply -f kube-flannel.yml
输出结果如下
master@master:~/working$ sudo kubectl apply -f kube-flannel.yml
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
master@master:~/working$
安装flannel网络前 执行kubectl get nodes
输出结果如下
master@master:~/working$ kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady master 4m10s v1.13.1
安装flannel网络后 执行kubectl get nodes
输出结果如下
master@master:~/working$ kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready master 10m v1.13.1
此时master已经是Ready
状态了,表示已经配置成功了,那么我们就需要配置node来加入这个集群。
如果一直还是NotReady状态,可以用如下命令查看pod运行状态
sudo kubectl get pods --all-namespaces
可以看到集群中有许多的pod的状态不是RUNNING状态,而是Pending、ContainerCreating、ImagePullBackOff之类的没有就绪的状态,但通过这个命令我们可以查看到那些未就绪的pod的名字
然后我们通过如下命令,查看某一特定pod的具体情况
kubectl describe pod <pod name> --namespace=kube-system
kubectl describe pod kube-flannel-ds-amd64-d9rjr --namespace=kube-system
可以看到某一特定pod的运行状态,命令的输出中就可以看到是某一特定的镜像拉取失败,从这里就可以看到镜像名了,例如镜像名为quay.io/coreos/flannel:v0.11.0-amd64
的镜像拉取失败
我们可以通过手动拉取镜像
将quay.io/coreos/flannel:v0.11.0-amd64
改为quay-mirror.qiniu.com /coreos/flannel:v0.11.0-amd64
,使用命令:
docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64
即可以拉取镜像
拉取完成之后,将quay-mirror.qiniu.com /coreos/flannel:v0.11.0-amd64
改为quay.io/coreos/flannel:v0.11.0-amd64
,使用命令:
docker tag docker pull quay-mirror.qiniu.com/coreos/flannel:v0.11.0-amd64 quay.io/coreos/flannel:v0.11.0-amd64
之后重新执行
kubectl apply –f kube-flannel.yml
如果还是下载不下来的话,只能用科学上网抢救一下了。。
sudo apt install -y selinux-utils
sudo swapoff -a
sudo setenforce 0
sudo ufw disable
# 启动kubelet 设置为开机自启动
$ sudo systemctl enable kubelet
# 启动k8s服务程序
$ sudo systemctl start kubelet
将master机器的/etc/kubernetes/admin.conf
传到到node1和node2
登录master
终端
#将admin.conf传递给node1
sudo scp /etc/kubernetes/admin.conf [email protected]:/home/master/
#将admin.conf传递给node2
sudo scp /etc/kubernetes/admin.conf [email protected]:/home/master/
node1
终端,创建基础kube配置文件环境$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
node2
终端,创建基础kube配置文件环境$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
node1
和node2
分别连接master
加入master集群。这里用的是kubeadm join
指令$ sudo kubeadm join 192.168.174.133:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:8476ea088b475863dfa5a8a642ae3bc3db5df32b3b8b5526f777d411397b8bb7
这里要注意,使用的hash应该是master
主机 kubeadm init
成功之后生成的hash码。
将master
中的kube-flannel.yml
分别传递给两个node
节点.
#将kube-flannel.yml传递给node1
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/master/
#将kube-flannel.yml传递给node2
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/master/
分别启动flannel
网络
master@node1:~$ kubectl apply -f kube-flannel.yml
master@node2:~$ kubectl apply -f kube-flannel.yml
master@node2:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 35m v1.13.1
node1 Ready <none> 2m23s v1.13.1
node2 Ready <none> 40s v1.13.1
到这里Kubernetes集群的搭建就完成了。