虚拟环境准备
节点设计
- 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,此处不做介绍