Ubuntu16.04+K8s安装配置(不FQ)

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安装的虚拟机,主机名必须不一样。

安装部署


安装说明

  1. 2台主机上都要安装docker,参考Docker学习:Docker安装和基本使用
  2. 2台主机上都要安装kubeadm、kubelet和kubectl
  3. 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

说明

  1. 注意这里执行初始化用到了- -image-repository选项,指定初始化需要的镜像源从阿里云镜像仓库拉取。国外服务器的镜像仓库经常出现超时,当然也可以使用国内其他镜像。
  2. --apiserver-advertise-address:指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
  3. --image-repository:Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.13版本中我们可以增加–image-repository参数,默认值是 k8s.gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers
  4. --kubernetes-version:关闭版本探测,因为它的默认值是stable-1,会导致下载最新版本,这里固定版本1.14.2的
  5. --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 

初始化过程说明:

  1. [preflight] kubeadm 执行初始化前的检查。
  2. [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  3. [certificates] 生成相关的各种token和证书
  4. [kubeconfig] 生成 KubeConfig 文件,kubelet 需要这个文件与 Master 通信
  5. [control-plane] 安装 Master 组件,会从指定的 Registry 下载组件的 Docker 镜像。
  6. [bootstraptoken] 生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  7. [addons] 安装附加组件 kube-proxy 和 kube-dns。
  8. Kubernetes Master 初始化成功,提示如何配置常规用户使用kubectl访问集群。
  9. 提示如何安装 Pod 网络。
  10. 提示如何注册其他节点到 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-frcjfkube-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 nodekubectl get pod --all-namespaces可以查看节点集群状态,删除之后需要等待一段时间,pod才能启动,如图

注:以上内容根据慕课网完成。

参考部分博客信息:

墙内安装kubernetes教程

posted @ 2019-05-21 22:12  janehost  阅读(107)  评论(0编辑  收藏  举报