Kubernetes首字母为K,末尾为s,中间一共有8个字母,所以简称K8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes 的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes 提供了应用部署,规划,更新,维护的一种机制。
KubernetesKubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统。 它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。 星际尺度 Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下进行规模扩展。 处处适用 无论是本地测试,还是跨国公司,Kubernetes 的灵活性都能让你在应对复杂系统时得心应手。 永不过时 Kubernetes 是开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让您轻松地做出合适的选择。 The Challenges of Migrating 150+ Microservices to Kubernetes -- 将 150+ 微服务迁移到 Kubernetes 上的挑战 By Sarah Wells, Technical Director for Operations and Reliability, Financial Times-- Sarah Wells, 运营和可靠性技术总监, 金融时报Watch Video Attend KubeCon in Shanghai on Nov. 13-15, 2018 -- 参加11月13日到15日的上海 KubeCon Attend KubeCon in Seattle on Dec.https://kubernetes.io/zh/
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,提供kubeadm init 和 kubeadm join,用于快速部署Kubernetes集群。
安装 kubeadm | Kuberneteshttps://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
三台虚拟机(都是CentOS7),一台master,两台node,node1、node2.
注意:三台虚拟机之间网络互通,同时可以访问外网,禁止swap分区
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
名称 | ip |
master | 192.168.111.129 |
node1 | 192.168.111.130 |
node2 | 192.168.111.131 |
禁止swap分区命令
swapoff -a
启动swap分区命令
swapon -a
永久关闭swap分区命令
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
然后开始在每台机器上执行下面的命令
关闭防火墙
systemctl stop firewalld #暂时关闭
systemctl disable firewalld #永久关闭
# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0
设置主机名
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8smaster
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8snode2
在master添加hosts
cat >> /etc/hosts << EOF
192.168.111.129 k8smaster
192.168.111.130 k8snode1
192.168.111.131 k8snode2
EOF
将桥接的IPv4流量传递到iptables的链 (每台虚拟机都设置)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
生效
sysctl --system
时间同步(每台虚拟机上执行)
yum install ntpdate -y
ntpdate time.windows.com
所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker
首先配置一下Docker的阿里yum源
cat >/etc/yum.repos.d/docker.repo<
然后yum方式安装docker
yum安装
yum -y install docker-ce
查看docker版本
docker --version
启动docker
systemctl enable docker
systemctl start docker
配置阿里云镜像加速
进入阿里云官网,找到容器镜像服务下的镜像加速器
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
地址换成自己的地址,依次执行官方的这四条命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
然后我们还需要配置一下yum的k8s软件源
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
由于版本更新频繁,这里指定版本号部署:
# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet
在 192.168.111.129 执行,也就是master节点
kubeadm init --apiserver-advertise-address=192.168.111.129 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
报错说我的cpu是单核的,最少需要双核
,于是修改为双核的
再次执行成功
由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像
docker images
当我们出现下面的情况时,表示kubernetes的镜像已经安装成功
使用kubectl工具 【master节点操作】
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行完成后,我们使用下面命令,查看我们正在运行的节点
kubectl get nodes
能够看到,目前有一个master节点已经运行了,但是还处于未准备状态
下面我们还需要在Node节点执行其它的命令,将node1和node2加入到我们的master节点上
下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点
执行在kubeadm init输出的kubeadm join命令:
注意,以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的
kubeadm join 192.168.111.129:6443 --token q7v792.m6o4sxqt1h2y52zr \
--discovery-token-ca-cert-hash sha256:38867c3254c20d1f98bcab42a7e08a1c2bca4d05b2fa624a24b6de6dc39ac81
node1执行命令
报错,发现是之前禁止swap没成功导致
swapoff: /dev/dm-1: swapoff failed: Cannot allocate memory
解决方法很简单,直接 reboot,然后才开机的时候(内存使用最少)关闭分区。
报错,fatal error: runtime: out of memory
修改虚拟机内存,我之前是1G
再次执行命令再报错,connect: no route to host,跟node2执行报一样的错,后面node2解决
node2执行命令
报错,error execution phase preflight: couldn't validate the identity of the API Server: expected a 32 byte SHA-256 hash, found 31 bytes
解决方法
# master 查看节点检查token是否有效
kubeadm token list
# 生成新的token和命令。然后在node重新执行
kubeadm token create --print-join-command
生成新的命令后再执行
报错,connect: no route to host
重新执行关闭防火墙等那些命令后重试解决
当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况
kubectl get nodes
上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问
下载网络插件配置
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
报错,安装wget
yum install wget -y
再次保存后执行
默认镜像地址无法访问,sed命令修改为docker hub镜像仓库
# 添加
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 查看状态 【kube-system是k8s中的最小单元】
kubectl get pods -n kube-system
运行完成后,我们查看状态可以发现,已经变成了Ready状态
kubectl get nodes
如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除
kubectl delete node k8snode1
然后到k8snode1节点进行重置
kubeadm reset
重置完后在加入
kubeadm join 192.168.111.129:6443 --token l2yyw9.dswy2nv9d5j1nrit --discovery-token-ca-cert-hash sha256:38867c3254c20d1f98bcab42a7e08a1c2bca4d05b2fa624a24b6de6dc39ac810