20200127_Kubernetes集群环境搭建

虚拟环境准备

节点设计

  • k8s-master:master节点 172.19.20.210
  • k8s-work1: work1节点 172.19.20.211
  • k8s-work2: work2节点 172.19.20.212

三个节点都是虚拟机,用户名和密码:root/123456,20G硬盘 4G内存

网络设置

采用桥接方式,centos7不提供eth0网络,可通过重命名方式mv etc/sysconfig/network-scripts/ifcfg-ens33 然后编辑:

#进入网络配置目录
cd /etc/sysconfig/network-scripts/
#重命名ens33->eth0
mv ifcfg-ens33 ifcfg-eth0
#编辑配置如下
vi ifcfg-eth0
#重启网络
systemctl restart network
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
#修改dhcp->static
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no 
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
#修改ens33->eth0
NAME=eth0
UUID=eb4a4b3f-d25e-49e3-a747-5d04cb5aedfd
DEVICE=ens33
#修改no->yes
ONBOOT=yes
#以下新增
IPADDR=172.19.20.200
GATEWAY=172.19.0.1
NETMASK=255.255.0.0
#end

如果还不清楚,可参考https://www.cnblogs.com/cnjavahome/p/11266931.html

我这边由于有网络限制,无法上外网,为了能够上外网,通过一个代理服务上网

echo "export http_proxy=http://xxxx" >> ~/.bashrc
echo "export https_proxy=https://xxx" >> ~/.bashrc
source ~/.bashrc

在安装vmware过程中,发现没有vMnet0网络,网上找了一堆没用的答案,最终发现是windows10环境下需要通过【属性】-【兼容性】-【以管理员身份运行】

K8s简介

K8S架构简介

在这里插入图片描述

以上每个框代表一台服务器,以上图形中,一共包含四台服务器,共同组成了一个ETCB集群。

K8S架构总体分为两个角色:master角色+node角色,master负责集群的管理,接收用户的指令请求,并分配到不同的计算节点上,node作为计算节点,负责接收master的指令并执行相应任务的。

master:

​ apiServer:整个架构的核心,所有的组件都要与apiServer通信

​ kubelet:负责完成master分配的任务

kube-proxy:管理任务的网络

Docker Engine:k8s不具备容器引擎,需要借助第三方的容器引擎来运行和管理容器,

ETCD:K8S的数据都存储在ETCD中

在这里插入图片描述
ETCD主要是与apiServer通信。K8S最小部署单元是POD,每个POD中可以跑多个容器,KUBELET负责创建pod,pod负责封装容器,通过proxy访问POD,用户通过访问API Server来管理集群,由apiServer做统一的协调,由node来完成任务。

K8S核心组成

Kubernetes主要由以下几个核心组件组成:

  • etcd保存了整个集群的状态;
  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);
  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

除了核心组件,还有一些推荐的Add-ons:

  • kube-dns负责为整个集群提供DNS服务

  • Ingress Controller为服务提供外网入口

  • Heapster提供资源监控

  • Dashboard提供GUI

  • Federation提供跨可用区的集群

  • Fluentd-elasticsearch提供集群日志采集、存储与查询

K8S安装详解

最低要求

  • 2台或者多台计器,centos7操作系统

  • 硬件配置,4GRAM,2CPU核心,30G硬盘

  • 网络互通,可访问外网(如果不能上外网,则需要搭建私有仓库下载软件和依赖)

  • 禁止swap分区 (会有一定的性能影响) (swap -a)

  • 准备软件环境

    可通过xshell提供的【工具】-【发送键到所有会话】

准备工作

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
  • 关闭swap
#临时
swapoff -a
#永久
vim /etc/fstabs 
  • 添加host
vim /etc/hosts
172.19.20.200 k8s-master
172.19.20.201 k8s-work1
172.19.20.202 k8s-work2
  • 将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-ip4tables = 1
EOF
sysctl --system

不开可能对接一些网络组件的话会有一些流量的丢失,没有验证过。最最好开启。

套件安装

  • 安装Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker

18.6是被K8S官方检测过的,兼容性较好

  • 添加aliyun yum软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 安装kubeadmin,kubelet,kubectl

当前最新版本已经是1.17了 ,为了使用高版本带来的不必要的环境问题,这里指定的是1.15

yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
systemctl enable kubelet
  • 部署kubernetes Master

需要master节点上运行

kubeadm init --apiserver-advertise-address=172.19.20.200 --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version v1.15.0  --service-cidr=10.1.0.0/16  --pod-network-cidr=10.244.0.0/16 

此处需要保证节点的时间与远程服务器的时间是一致的,否则服务器认为证书过期,会拒绝下载

certificate has expired or is not yet valid

几个时间服务器貌似都不可用,我直接通过肉眼同步

date -s '2020-01-21 12:20:44'

CPU如果少于2个,则提示报错

[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

可通过编辑虚拟机设置来完成

提示connection refused

[ERROR ImagePull]: failed to pull image registry.aliyuncs.com/google_containers/coredns:1.3.1: output: Error response from daemon: Get https://registry.aliyuncs.com/v2/: dial tcp: lookup registry.aliyuncs.com on [::1]:53: read udp [::1]:43296->[::1]:53: read: connection refused

可通过设置docker代理上网来解决

mkdir -p /etc/systemd/system/docker.service.d/
cat <<EOF > /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://xxxx" "NO_PROXY=xxxx"
EOF
systemctl daemon-reload
systemctl restart docker

启用kubectl工具

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

#验证kubectl
kubectl get nodes
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
 echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
 echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables

正常情况下,默认日志级别下,整个执行的输出日志如下:

[init] Using Kubernetes version: v1.15.0
#拉取镜像
#启动kubelet
#生成证书
......
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.2.200:6443 --token 0a0v43.8o4ti52zxhfmx0s1 \
    --discovery-token-ca-cert-hash sha256:0f42404d860bbf4c313506ae368922d8c3226e898795ffe5c43082dbb71b57e3 

按照提示,运行以下命令:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 安装pod网络插件

可选flannel、calico、weave-net等

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

网络插件部署完成后,可以查看相关pods有没有启动

[root@localhost ~]# kubectl get pods -n kube-system
NAME                                            READY   STATUS    RESTARTS   AGE
coredns-bccdc95cf-js2tx                         1/1     Running   0          19m
coredns-bccdc95cf-zvh5m                         1/1     Running   0          19m
etcd-localhost.localdomain                      1/1     Running   0          18m
kube-apiserver-localhost.localdomain            1/1     Running   0          18m
kube-controller-manager-localhost.localdomain   1/1     Running   0          18m
kube-proxy-5flg2                                1/1     Running   0          19m
kube-scheduler-localhost.localdomain            1/1     Running   0          18m
weave-net-fwl6f                                 2/2     Running   0          9m31s

加入集群

按照kubeadm init的提示内容,将节点加入集群。

kubeadm join 192.168.2.200:6443 --token 0a0v43.8o4ti52zxhfmx0s1 --discovery-token-ca-cert-hash sha256:0f42404d860bbf4c313506ae368922d8c3226e898795ffe5c43082dbb71b57e3 

如果忘了加入命令或者token过期,可通过以下命令获取

kubeadm token create --print-join-command

此时,可以查看集群节点状态,前提是要加入config认证

[root@localhost .kube]# kubectl get nodes
NAME                    STATUS   ROLES    AGE     VERSION
k8s-work1               Ready    <none>   17m     v1.15.0
k8s-work2               Ready    <none>   7m44s   v1.15.0
localhost.localdomain   Ready    master   56m     v1.15.0

测试集群

K8S应用部署流程

K8S应用部署,简单的说,就是deployment-service-ingress这三个核心的模块创建
在这里插入图片描述

测试部署(nginx)

此处用一个简单的nginx镜像来测试

#创建deploy
kubectl create deployment nginx --image=nginx
#暴露服务service
kubectl expose deployment nginx --port=80 --type=NodePort
#查看
[root@localhost ~]# kubectl get pod,svc -n default | grep nginx
pod/nginx-554b9c67f9-85bqz   1/1     Running   0          108s
service/nginx        NodePort    10.1.188.35   <none>        80:31024/TCP   102s

访问部署的服务

curl http://192.168.2.201:31024/ 

实际我们暴露服务,都是通过ingress,此处不做介绍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值