Ubuntu上K8s安装配置(不FQ)
k8s简介
Kubernetes简称k8s,主要是基于容器技术的分布式架构领先方案。它是google严格保密十几年的密码武器-Borg的一个开源版本。
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。
k8s特点
- 容器的自动化复制和部署。随时扩展或收缩容器规模,并提供负载均衡
- 方便地容器升级
- 提供容器弹性,如果失效就替代它
环境配置
主机 | 用途 | 主机名 | 操作系统 | 网络模式 | 内存 |
---|---|---|---|---|---|
192.168.150.130 | k8s-master | Ubuntu | Ubuntu16.04 | 桥接 | 1024M |
192.168.150.129 | k8s-node | Ubuntu-node | Ubuntu16.04 | 桥接 | 1024M |
说明:这里的ubuntu使用的是Virtual Box安装的虚拟机,主机名必须不一样。
安装部署
安装说明
- 2台主机上都要安装docker,参考Docker学习:Docker安装和基本使用
- 2台主机上都要安装kubeadm、kubelet和kubectl
- 2台主机上都要禁用虚拟内存
关闭swap(Master和Node都需要)
kubernetes要求必须关闭swap。
同时一定要记得把/etc/fstab
包含swap那行记录删掉
# 关闭虚拟内存
swapoff -a
安装更新apt-transport-https curl(Master和Node都需要)
# 安装更新apt-transport-https curl
apt-get update && apt-get install -y apt-transport-https curl
增加kubernetes aliyun镜像源(Master和Node都需要)
# 增加kubernetes aliyun镜像源
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
安装kubeadm/kubelet/kubectl(Master和Node都需要)
# 安装kubeadm/kubelet/kubectl
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
kubeadm初始化,使用aliyun(仅Master)
kubeadm init
--apiserver-advertise-address=192.168.150.130
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.14.2
--pod-network-cidr=10.244.0.0/16
说明
- 注意这里执行初始化用到了- -image-repository选项,指定初始化需要的镜像源从阿里云镜像仓库拉取。国外服务器的镜像仓库经常出现超时,当然也可以使用国内其他镜像。
--apiserver-advertise-address
:指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。--image-repository
:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.13版本中我们可以增加–image-repository参数,默认值是 k8s.gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers--kubernetes-version
:关闭版本探测,因为它的默认值是stable-1,会导致下载最新版本,这里固定版本1.14.2的--pod-network-cidr
:指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。如果使用weave Network则可以不用配置此项,具体可参考说明
完整的官方文档可以参考:
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
执行安装成功之后,可以看到如下截图
其中需要将此段信息复制保存在本地文件,如下
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.150.130:6443 --token xfn9s1.3iei2015u7ltjbqw
--discovery-token-ca-cert-hash sha256:5a2efa18004e4b491119403ac55fa47d88c75414e2ffdda59cb56fb673236d0c
初始化过程说明:
- [preflight] kubeadm 执行初始化前的检查。
- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates] 生成相关的各种token和证书
- [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
- [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
- [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
- [addons] 安装附加组件 kube-proxy 和 kube-dns。
- Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。
- 提示如何安装 Pod 网络。
- 提示如何注册其他节点到 Cluster。
配置 kubectl(master执行)
kubectl 是管理 Kubernetes Cluster 的命令行工具,前面已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
依照 kubeadm init 输出的最后提示
# 保存集群安全配置文件到当前用户.kube目录,说明当前操作是使用root命令进行操作
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 启用 kubectl 命令自动补全功能(注销重新登录生效)
echo "source <(kubectl completion bash)" >> ~/.bashrc
master上安装网络插件flannel(master执行)
要让 Kubernetes Cluster 能够工作,必须安装 Pod 网络,否则 Pod 之间无法通信。
Kubernetes 支持多种网络方案,这里我们使用 flannel
# master上执行网络插件
sysctl net.bridge.bridge-nf-call-iptables=1
curl -O https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
修改网络插件配置(master执行)
vim kube-flannel.yml
# 找到 tolerations 下方增加:
- key: node.kubernetes.io/not-ready
operator: Exists
effect: NoSchedule
保存并应用配置(master执行)
kubectl apply -f kube-flannel.yml
Node节点加入集群(仅Node执行)
# 在node上执行join命令
kubeadm join 192.168.150.130:6443 --token xfn9s1.3iei2015u7ltjbqw
--discovery-token-ca-cert-hash sha256:5a2efa18004e4b491119403ac55fa47d88c75414e2ffdda59cb56fb673236d0c
说明
加入集群此命令是Master初始化成功之后,最后的一段代码,可参考上面信息。
配置iptables(Node执行)
# 在node上执行
sysctl net.bridge.bridge-nf-call-iptables=1
集群验证
然后根据提示,我们可以通过 kubectl get nodes 查看节点的状态:
集群状态查看(Master执行)
# 在master上检测pod是否正常
kubectl get node
kubectl get pod --all-namespaces
从上图中我们可以看到,kube-flannel-ds-frcjf
和kube-flannel-ds-2cvkn
状态是ImagePullBackOff
,这个如何解决呢?我们可以通过 kubectl describe pod
查看 Pod 具体情况,以确认拉取失败的镜像
# describe查看(Master执行)
kubectl describe po kube-flannel-ds-frcjf -n kube-system
执行结果如下
kubectl describe po kube-flannel-ds-frcjf -n kube-system
......
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m14s default-scheduler Successfully assigned kube-system/kube-flannel-ds-frcjf to k8s-node
Warning Failed 109s kubelet, k8s-node Failed to pull image "quay.io/coreos/flannel:v0.10.0-amd64": rpc error: code = Unknown desc = Error response from daemon: Get https://quay.io/v2/: net/http: TLS handshake timeout
Warning Failed 109s kubelet, k8s-node Error: ErrImagePull
Normal BackOff 108s kubelet, k8s-node Back-off pulling image "quay.io/coreos/flannel:v0.10.0-amd64"
Warning Failed 108s kubelet, k8s-node Error: ImagePullBackOff
Normal Pulling 94s (x2 over 2m6s) kubelet, k8s-node pulling image "quay.io/coreos/flannel:v0.10.0-amd64"
先使用kubectl describe po
查看问题,这里发现是flannel:v0.10.0-amd64
文件无法下载。可以使用docker pull
重新下载镜像。
#在node上重新pull flannel:v0.10.0-amd64(Node执行)
docker pull registry.cn-shenzhen.aliyuncs.com/lurenjia/flannel:v0.10.0-amd64
docker tag registry.cn-shenzhen.aliyuncs.com/lurenjia/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
这里是因为无法从 quay.io/coreos/flannel:v0.10.0-amd64
下载镜像,所以从阿里云或者dockerhub镜像仓库下载,然后改回原来的tag。直接从quay.io/coreos/flannel:v0.10.0-amd64
下载镜像,执行此下命令即可:
docker pull quay.io/coreos/flannel:v0.10.0-amd64
删除Node(Master执行)
Node节点中出现问题的镜像已经拉去下来,此时我们可以删除有问题的pod,K8S会自动调度pod。
# 删除pod
kubectl delete pod kube-flannel-ds-2cvkn -n kube-system
然后再度使用kubectl get node
和kubectl get pod --all-namespaces
可以查看节点集群状态,删除之后需要等待一段时间,pod才能启动,如图
注:以上内容根据慕课网完成。
参考部分博客信息: