虚拟化运维--K8S--安装(十)

一、主机、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/

  1. 仓库准备
    所有节点操作
# 下载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

  1. 安装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

  1. 初始化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 

四、常见问题:

  1. 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

  1. [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
    必须将CPU个数设置为2。

  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"]
}
  1. [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

  1. 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
  1. Kubernetes pod状态出现ImagePullBackOff的原因

  2. 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中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容