基于Kubeadm 搭建K8s集群:

  通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的。只有不断地操作去熟练,强化自己对他的认知,才能提升境界。

  我们就去搭建一个集群来感受一下。我这里搭建的一个Master 2个 Worker。尽量保持机器环境干净,我由于minikube没装好导致kubelet一直无法启动。

  配置要求(官网推荐https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#installing-kubeadm-kubelet-and-kubectl)

  • One or more machines running one of:2 GB or more of RAM per machine (any less will leave little room for your apps)

    • Ubuntu 16.04+
    • Debian 9+
    • CentOS 7【本案例演示】
    • Red Hat Enterprise Linux (RHEL) 7
    • Fedora 25+
    • HypriotOS v1.0.1+
    • Container Linux (tested with 1800.6.0)
  • 2 CPUs or more
  • Full network connectivity between all machines in the cluster (public or private network is fine)
  • Unique hostname, MAC address, and product_uuid for every node. See here for more details.
  • Certain ports are open on your machines. See here for more details.
  • Swap disabled. You MUST disable swap in order for the kubelet to work properly.

  组件版本(很重要):

Docker       18.09.
---
kubeadm-1.14.-
kubelet-1.14.-
kubectl-1.14.-
---
k8s.gcr.io/kube-apiserver:v1.14.0
k8s.gcr.io/kube-controller-manager:v1.14.0
k8s.gcr.io/kube-scheduler:v1.14.0
k8s.gcr.io/kube-proxy:v1.14.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.
k8s.gcr.io/coredns:1.3.
---
calico:v3.

1.更新并安装依赖:

yum -y update  //这个命令会更新内核,不推荐使用,除非你确保更新完没问题。有可能更新完机器起不来  报个 Minimal 。。。啥错。
yum -y upgrade // 推荐使用
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp //安装依赖

2.安装Docker

3.修改 hosts 文件:

  永久修改hostname:vi /etc/sysconfig/network,最后增加一行,比如hostname=m这种。

192.168..101执行:sudo hostnamectl set-hostname m
192.168..102执行:sudo hostnamectl set-hostname w1
192.168..103执行:sudo hostnamectl set-hostname w2 //修改三台的hosts
vi /etc/hosts
192.168.1.101 m
192.168.1.102 w1
192.168.1.103 w2

 4.系统基础前提配置(官网有提到):

# ()关闭防火墙
systemctl stop firewalld && systemctl disable firewalld # ()关闭selinux
setenforce
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # ()关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab # ()配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT # ()设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables =
net.bridge.bridge-nf-call-iptables =
EOF sysctl --system

5.Installing kubeadm, kubelet and kubectl

  官网对这三个组件是这么介绍的:You will install these packages on all of your machines:

  • kubeadm: the command to bootstrap the cluster.

  • kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.

  • kubectl: the command line util to talk to your cluster.

  由于这三个的源官方推荐的是国外的源我们没办法访问,我们这里改成阿里云的源:

//# 1 配置源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=
gpgcheck=
repo_gpgcheck=
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
//# 2 安装kubeadm&kubelet&kubectl
yum install -y kubeadm-1.14.- kubelet-1.14.- kubectl-1.14.-
//# 3 docker和k8s设置同一个cgroup
//# docker
vi /etc/docker/daemon.json
添加:"exec-opts": ["native.cgroupdriver=systemd"],
systemctl restart docker //# kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/-kubeadm.conf
//重启
systemctl enable kubelet && systemctl start kubelet

6.proxy/pause/scheduler等国内镜像:

  1.查看kubeadm使用的镜像 kubeadm config images list

  可以发现这里都是国外的镜像,为了解决国外镜像不能访问的问题,创建kubeadm.sh脚本,我们基于阿里云的docker-image用于拉取镜像/打tag(重命名成k8s识别的如上图中的名称)/删除原有镜像。脚本如下:

#!/bin/bash

set -e

KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.
CORE_DNS_VERSION=1.3. 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

  运行脚本:sh ./kubeadm.sh

  查看镜像:docker images 可以看到镜像准备完毕.

  如果需要把镜像保存下来可以将其推送到阿里云,具体步骤参照 https://www.cnblogs.com/wuzhenzhao/p/11798039.html 脚本如下:

#!/bin/bash

set -e

KUBE_VERSION=v1.14.0
KUBE_PAUSE_VERSION=3.1
ETCD_VERSION=3.3.
CORE_DNS_VERSION=1.3. GCR_URL=k8s.gcr.io
ALIYUN_URL=xxx 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 tag $GCR_URL/$imageName $ALIYUN_URL/$imageName
docker push $ALIYUN_URL/$imageName
docker rmi $ALIYUN_URL/$imageName
done

7.kube init 初始化 master:

  在此之前我们需要看一下 kubelet 的状态,他要是没起来就会出问题:systemctl status kubelet

  运行journalctl -xefu kubelet 命令查看systemd日志

  在kubeadm init 之前kubelet会不断重启。

  然后进入初始化 Master 节点:【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】   阿里云如果没有域名使用内网。不然报错

#本地有镜像
kubeadm init --kubernetes-version=1.14. --apiserver-advertise-address=192.168.1.101 --pod-network-cidr=10.244.0.0/

  然后会看到打印出来的信息:如果没成功,可以查看日志信息   tail /var/log/message 来查看

  根据日志提示执行三个命令:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

  其中有一条非常重要的信息,就是Worker节点 kubeadm join的信息: 阿里云要配置内网互通:跨账号同地域网络实例互通

kubeadm join 192.168.1.101: --token w8lo7h.pozwo9cnfzzgqsr5 \
--discovery-token-ca-cert-hash sha256:ddaa9ca87e04a51031572c50e8140e76fbb31ac1b9b40e48ffbff84ff29eb32f

  这个如果超过了24小时,则需要重新生成Token。脚本如下:

#!/bin/bash

if [ $EUID -ne  ];then
echo "You must be root (or sudo) to run this script"
exit
fi if [ $# != ] ; then
echo "Usage: $0 [master-hostname | master-ip-address]"
echo " e.g.: $0 api.k8s.hiko.im"
exit ;
fi token=`kubeadm token create`
cert_hash=`openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der >/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'` echo "Refer the following command to join kubernetes cluster:"
echo "kubeadm join $1:6443 --token ${token} --discovery-token-ca-cert-hash sha256:${cert_hash}"

  sudo sh ./join.sh  IP/hostname ,执行以下就OK啦。

  此时kubectl cluster-info查看一下是否成功:

  查看pod验证一下,等待一会儿【一定要等待最下面5个pod启动成功,处于ready状态再往下进行,不然后面会出错】然后可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了

  注意:coredns没有启动,需要安装网络插件

  kubectl get pods -n kube-system

  健康检查: curl -k https://localhost:6443/healthz

  这个步骤主要做了以下几件事:

//01-进行一系列检查,以确定这台机器可以部署kubernetes

//02-生成kubernetes对外提供服务所需要的各种证书可对应目录
  /etc/kubernetes/pki/* //03-为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf //04-为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml //05-生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml
kube-apiserver.yaml
kube-controller-manager.yaml
kube-scheduler.yaml
etcd.yaml //06-一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来 //07-为集群生成一个bootstrap token //08-将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用 //09-最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的

8.部署calico网络插件:

  选择网络插件(官网网络插件介绍):https://kubernetes.io/docs/concepts/cluster-administration/addons/

calico网络插件(calico插件介绍):https://docs.projectcalico.org/v3.9/getting-started/kubernetes/

  在master节点上操作,我这里是把这个yaml下载下来放在了本地。:

# 在k8s中安装calico
# 这里实际上就是用了一个calico.yaml文件,大家也可以把这个文件下载下来,看看里面的内容
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml

  确认一下calico是否安装成功【一定要等待所有的pod都成功了,处于ready状态再往下进行,不然会报错】

  kubectl get pods --all-namespaces -w

 9.worker 节点 join:

  在master节点上检查集群信息  kubectl get nodes

  删除节点:kubectl  delete nodes w2

  如果要重新加入,也要执行 kubeadm reset

  卸载清理K8s:

kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd

Pod初体验:

1.定义pod.yml文件,比如pod_nginx_rs.yaml

cat > pod_nginx_rs.yaml <<EOF
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
tier: frontend
spec:
replicas:
selector:
matchLabels:
tier: frontend
template:
metadata:
name: nginx
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort:
EOF

2.根据pod_nginx_rs.yml文件创建pod

  kubectl apply -f pod_nginx_rs.yaml

  创建完查看一下pod,发现还在创建

  等待一段时间再看:kubectl get pods

  查看 kubectl get pods -o wide

  查看描述 kubectl describe pod nginx ,如果没启动也能看到报错信息。

[root@m ~]# kubectl describe pod nginx
Name: nginx-66rpb
Namespace: default
Priority:
PriorityClassName: <none>
Node: w1/192.168.1.102
Start Time: Wed, Dec :: +
Labels: tier=frontend
Annotations: cni.projectcalico.org/podIP: 192.168.190.65/
Status: Running
IP: 192.168.190.65
Controlled By: ReplicaSet/nginx
Containers:
nginx:
Container ID: docker://cbff183cec2a5619f15149b8a1652018e0796db7fdee0407b9e9df47a6015ccf
Image: nginx
Image ID: docker-pullable://nginx@sha256:50cf965a6e08ec5784009d0fccb380fc479826b6e0e65684d9879170a9df8566
Port: /TCP
Host Port: /TCP
State: Running
Started: Wed, Dec :: +
Ready: True
Restart Count:
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-rq7b2 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-rq7b2:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-rq7b2
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m33s default-scheduler Successfully assigned default/nginx-66rpb to w1
Normal Pulling 2m30s kubelet, w1 Pulling image "nginx"
Normal Pulled 84s kubelet, w1 Successfully pulled image "nginx"
Normal Created 84s kubelet, w1 Created container nginx
Normal Started 83s kubelet, w1 Started container nginx  //.....省略其余两个的信息,一摸一样
[root@m ~]#

  访问一下:OK

3.感受通过rs将pod扩容:

  kubectl scale rs nginx --replicas=5

  查看:kubectl get pods -o wide

  删除pod:kubectl delete -f pod_nginx_rs.yaml

  删除完成。

pod.yaml:

  我们来简单的看一下配置文件的内容:

apiVersion: v1   --版本号
kind: Pod -- 资源类型
metadata: --元数据
name: nginx -- 名称
labels: -- 标签
app: nginx
spec:
containers: --容器 ,可以多个
- name: nginx
image: nginx
ports:
- containerPort: 80
- name: mysql
image: mysql
ports:
- containerPort: 3306

  对于其中的内容我们做一个简单的了解先。其实pod中运行的容器正是我们通过docker ps|grep nginx 看到的

 我们会发现,无论哪个pod,里面都会存在一个k8s.gcr.io/pause:3.1,这个东西是干嘛的呢?Pod内的容器都是平等的关系,共享Network Namespace、共享文件

  pause容器的最主要的作用:创建共享的网络名称空间,以便于其它容器以平等的关系加入此网络名称空间

  pause进程是pod中所有容器的父进程(即第一个进程)Pod会有独立的IP地址,这个IP地址是被Pod中所有的Container共享的;

  就好像docker中网络共享中多个容器之间的通信我们可以通过 docker network connect tomcat-net tomcat01来加入另外的网络,或者在创建容器的时候使用 link。可以类比成这里是工具帮我加入到了 pause 容器的网络。使得容器间得以通信。

kubeadm搭建K8s集群及Pod初体验的更多相关文章

  1. kubeadm 搭建 K8S集群

    kubeadm是K8s官方推荐的快速搭建K8s集群的方法. 环境: Ubuntu 16.04 1 安装docker Install Docker from Ubuntu’s repositories: ...

  2. CentOS7 使用 kubeadm 搭建 k8s 集群

    一 安装Docker-CE 前言 Docker 使用越来越多,安装也很简单,本次记录一下基本的步骤. Docker 目前支持 CentOS 7 及以后的版本,内核要求至少为 3.10. Docker ...

  3. 使用kubeadm搭建k8s集群

    1.初始化集群信息 这里我才用了两台虚拟机来搭建集群,一个master,一个node 角色 IP地址 组件 master 192.168.126.137 docker, kubectl, kubead ...

  4. 使用Kubeadm创建k8s集群之部署规划(三十)

    前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...

  5. kubeadm 搭建kubernetes集群环境

    需求 kubeadm 搭建kubernetes集群环境 准备条件 三台VPS(本文使用阿里云香港 - centos7.7) 一台能SSH连接到VPS的本地电脑 (推荐连接工具xshell) 安装步骤 ...

  6. kubeadm搭建kubernetes集群之三:加入node节点

    在上一章<kubeadm搭建kubernetes集群之二:创建master节点>的实战中,我们把kubernetes的master节点搭建好了,本章我们将加入node节点,使得整个环境可以 ...

  7. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  8. 使用Kubeadm创建k8s集群之节点部署(三十一)

    前言 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜像拉取问题)还提供了多种解决方案.不 ...

  9. 使用kubeadm部署k8s集群[v1.18.0]

    使用kubeadm部署k8s集群 环境 IP地址 主机名 节点 10.0.0.63 k8s-master1 master1 10.0.0.63 k8s-master2 master2 10.0.0.6 ...

随机推荐

  1. jQuery后续和 前端框架Bootstrap

    目录 一.jQuery后续 1. 动画效果 (1)自定义点赞动画实例 2. jQuery的自带方法 (1)each (类似for循环) (2)data() (存放隐形的数据) 二.前端框架之Boots ...

  2. vue3作业

    """ 1.按照上方 知识点总结 模块,总结今天所学知识点: 2.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/t ...

  3. encode()和decode()两个函数

    编码可以将抽象字符以二进制数据的形式表示,有很多编码方法,如utf-8.gbk等,可以使用encode()函数对字符串进行编码,转换成二进制字节数据,也可用decode()函数将字节解码成字符串:用d ...

  4. 字典,set

    字典 dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度 存取速度快 key-value存储方式,在放进去的时候,必须根据key算出v ...

  5. C2MIF软件使用说明

    1.右击---管理员身份运行 2.打开文件txt---搞定!

  6. Python 爬虫十六式 - 第二式:urllib 与 urllib3

    Python请求标准库 urllib 与 urllib3 学习一时爽,一直学习一直爽!   大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了什么是HTTP协议,那么这一次我们就要动 ...

  7. JAVA第二周课程总结

    本周我们开始学习一门新的课程JAVA 本周主要学习内容: 1.认识java,以及它的开发工具jdk 2.了解Java的语言特点 3.搭建Java开发环境,jdk的安装和配置

  8. 百度编辑器ueditor上传图片失败,显示上传错误,实际上图片已经传到服务器或者本地

    报错,上传失败,图片没有显示,且调试response没有信息,但是图片已经上传到了本地 这个问题是因为ueditor里面的Upload.class.php里面__construct()方法里面的ico ...

  9. nginx利用try_files实现多个源

    比如一个视频网站,视频资源分散在几台机器上,但是给用要提供统一的IP,路径,端口.就需要nginx,先检查本机是否有改文件,如果没有就代理其他地方 location / { root /data/ww ...

  10. C语言的AES加密

    C语言的AES加密 稍微封装了几个函数 方便使用 #if 1 #include <stdio.h> #include <stdlib.h> #include <strin ...