k8s-安装

k8s安装

软件版本

go: 1.9.4
docker: 1.13.1
kubernetes: 1.10.3
kubernetes-kubeadm: 1.10.3

网络环境

172.28.7.238: 本地源、本地registry, 可以访问外网
172.28.4.105:master、node
172.28.4.106:node

下载源

所有待安装节点上,下载源:
参照:下载源

安装docker

所有待安装节点上,安装docker

1
yum install docker

安装kubernetes

在1.10.0之后的版本不再是kubelet、kubeadm、kubectl软件名,而需要安装kubernetes、 kubernetes-kubeadm,而kubernetes包括了kubelet、kubectl、kube-apiserver、kube-proxy、kube-scheduler,kubernetes-kubeadm就是kubeadm
在所有节点上安装kubelet、kubeadm、kubectl

1
yum install kubernetes kubernetes-kubeadm

kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器。
kubeadm 用于初始化 Cluster。
kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

selinux 设置

1
# setenforce 0

配置内核

1
2
3
4
5
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

设置免密登陆

所有节点互信

配置/etc/hosts 文件

所有节点的/etc/hosts文件都修改

配置镜像加速器

172.28.7.238:5000 是我搭建的本地registry,详细过程参考:
docker-搭建-本地-registry
所有节点都添加:

1
2
# cat /etc/docker/daemon.json
{"registry-mirrors": ["172.28.7.238:5000"],"insecure-registries": []}

启动docker与kubelet

1
2
# systemctl enable docker && systemctl start docker
# systemctl enable kubelet && systemctl start kubelet

这里查看/var/log/messages 会发现kubelet 日志有错误,这里不用管,因为kubelet还没有初始化。如果这里不启动,后面初始化会卡主。

本地registry 镜像获取

如果使用外网registry,可以省略该步骤
在172.28.7.238上执行:

1
2
3
4
5
6
7
8
9
10
11
12
# vim download_images.sh
#!/bin/bash
images=(kube-apiserver-amd64:v1.10.2 kube-controller-manager-amd64:v1.10.2 kube-scheduler-amd64:v1.10.2 kube-proxy-amd64:v1.10.2 etcd-amd64:3.1.12 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.10 k8s-dns-kube-dns-amd64:1.14.10 k8s-dns-dnsmasq-nanny-amd64:1.14.10)
for imageName in ${images[@]} ; do
docker pull reg.qiniu.com/k8s/$imageName
docker tag reg.qiniu.com/k8s/$imageName 172.28.7.238/$imageName
docker rmi reg.qiniu.com/k8s/$imageName
docker push 172.28.7.238/$imageName
done
# chmod +x download_images.sh
# ./download_images.sh

把从外网下载的镜像上传到本地的registry

下载镜像

所有k8s节点(172.28.0.105、172.28.0.106)执行:

1
2
3
4
5
6
7
8
9
10
11
# vim download_images.sh
#!/bin/bash
images=(kube-apiserver-amd64:v1.10.2 kube-controller-manager-amd64:v1.10.2 kube-scheduler-amd64:v1.10.2 kube-proxy-amd64:v1.10.2 etcd-amd64:3.1.12 pause-amd64:3.1 kubernetes-dashboard-amd64:v1.8.3 k8s-dns-sidecar-amd64:1.14.10 k8s-dns-kube-dns-amd64:1.14.10 k8s-dns-dnsmasq-nanny-amd64:1.14.10)
for imageName in ${images[@]} ; do
docker pull 172.28.7.238:5000/$imageName
docker tag 172.28.7.238:5000/$imageName k8s.gcr.io/$imageName
docker rmi 172.28.7.238:5000/$imageName
done
# chmod +x download_images.sh
# ./download_images.sh

从本地registry下载镜像到k8s节点,并重命名为 k8s.gcr.io 开头的镜像,如果不是 k8s.gcr.io 开头,则会从google下载

1
2
3
# docker tag k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.10 k8s.gcr.io/k8s-dns-sidecar-amd64:1.14.8
# docker tag k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.10 k8s.gcr.io/k8s-dns-kube-dns-amd64:1.14.8
# docker tag k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.10 k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64:1.14.8

把这三个镜像tag版本重新打为1.14.8

下载flannel镜像

在172.28.7.238上执行:

1
2
3
4
5
6
# docker pull quay.io/coreos/flannel:v0.10.0-amd64
# docker tag quay.io/coreos/flannel:v0.10.0-amd64 172.28.7.238:5000/flannel:v0.10.0-amd64
# docker push 172.28.7.238:5000/flannel:v0.10.0-amd64
# wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
# scp kube-flannel.yml root@172.28.4.105:~/
# scp kube-flannel.yml root@172.28.4.106:~/

下载flannel镜像,并上传到本地registry。
下载kube-flannel.yml ,并scp到所有的k8s节点

初始化kubelet

在master(172.28.4.105)执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# kubeadm init --kubernetes-version=v1.10.2 --apiserver-advertise-address 172.28.4.105 --pod-network-cidr 10.244.0.0/16
。。。
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 172.28.4.105:6443 --token kvp06r.4bxa0y8ie8vs5nfl --discovery-token-ca-cert-hash sha256:7d9df8a8d56a553bcfbe262007f594a6f1cd9c04d946b68138bb669da2287842

注意:这里必须指定–kubernetes-version,不然会从google下载最新版本。

保存后面这段输出到文本,以后会用到。

–apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
–pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为后面将使用 flannel 网络方案,必须设置成这个 CIDR。

配置认证信息

1
2
3
4
5
6
# 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 网络插件

在所有k8s节点上执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# mkdir -p /etc/cni/net.d/
# cat <<EOF> /etc/cni/net.d/10-flannel.conf
{
"name": "cbr0",
"type": "flannel",
"delegate": {
"isDefaultGateway": true
}
}
EOF
# mkdir /usr/share/oci-umount/oci-umount.d -p
# mkdir /run/flannel/
# cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
# kubectl apply -f kube-flannel.yml ## 之前从172.28.7.238上scp过来的yml文件

查看状态

在master节点上执行:

1
2
3
4
5
6
7
8
## 查看节点状态
# kubectl get nodes
## 查看pods状态
# kubectl get pods --all-namespaces
## 查看K8S集群状态
# kubectl get cs

让 master 成为pod

默认情况下,出于安全的考虑,并不会在主节点上运行pod,如果你想在主节点上运行pod,比如:运行一个单机版的kubernetes集群时,可运行下面的命令

1
2
3
4
5
# kubectl taint nodes --all node-role.kubernetes.io/master-
node "k8s-master" untainted
## 恢复master only状态执行:
# kubectl taint node k8s-master node-role.kubernetes.io/master="":NoSchedule

加入节点

在非master节点(172.28.4.106)上执行(该命令是在master上执行init后保存的那段命令):

1
# kubeadm join 172.28.4.105:6443 --token kvp06r.4bxa0y8ie8vs5nfl --discovery-token-ca-cert-hash sha256:7d9df8a8d56a553bcfbe262007f594a6f1cd9c04d946b68138bb669da2287842

正常情况,到master执行:
kubectl get nodes 就能看到该节点了
kubectl get pods –all-namespaces

删除操作

1
2
3
4
5
6
7
8
9
10
11
## 删除网络插件
# kubectl delete -f kube-flannel.yml
## 回滚init操作
# kubectl reset
## 删除节点
# kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
# kubectl delete node <node name>
## 最后登陆到该节点执行:
# kubeadm reset

遇到的问题

  1. The connection to the server localhost:8080 was refused - did you specify the right host or port?
    解决方法:
    引入环境变量:export KUBECONFIG=/etc/kubernetes/admin.conf

  2. 新加节点Unable to update cni config: No networks found in /etc/cni/net.d
    解决方法:
    从别的节点拷贝到/etc/cni/net.d/10-flannel.conf
    cat /etc/cni/net.d/10-flannel.conf:
    {
    “name”: “cbr0”,
    “type”: “flannel”,
    “delegate”: {
    “isDefaultGateway”: true
    }
    }

  3. failed to set bridge addr: “cni0” already has an IP address different from 10.244.2.1/24
    解决方法:
    kubeadm reset
    systemctl stop docker
    rm -rf /var/lib/cni/
    rm -rf /var/lib/kubelet/*
    rm -rf /etc/cni/
    ifconfig cni0 down
    ifconfig flannel.1 down
    ifconfig docker0 down
    ip link delete cni0
    ip link delete flannel.1
    systemctl start docker
    然后执行kubectl join 或者kubectl init等操作

参照:Installing kubeadm