一、简介
1.简介
kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
2.架构
1)Kubernetes集群的组成
1.1 Master节点的核心组件
Master节点是Kubernetes集群的管理和控制节点。Master节点由如下4个进程组成:
apiserver:提供Restful API,是整个集群管理和控制的入口。apiserver封装了资源对象的CRUD操作并持久化到etcd中,REST API提供给外部客户端和内部组件调用。
scheduler:是调度器,主要负责Pod调度,每个Pod最终被调度到哪台服务器上是由Scheduler决定的
controller-manager:是比较关键的组件,是Kubernetes集群中所有资源的自动化控制中心
etcd: etcd是一个分布式的键值存储,它实际上保存整个Kubernetes集群各种资源和状态,可以它理解成Kubernetes集群的数据库。
scheduler和controller-manager都是通过apiserver从etcd中获取各种资源的状态,进行相应的调度和控制操作。
1.2 Node节点的组件
Node节点是Kubernetes集群的工作负载节点,我们的服务实例是跑在多个Node节点上。Node节点上主要有如下组件:
kubelet:主要负责本节点Pod的生命周期管理,定期向Master上报本节点及Pod的基本信息。kubelet会从apiserver接收Pod的创建请求,启动和停止Pod。
kube-proxy: 实现Kubernetes上Service的通信及负载均衡。kuer-proxy目前有userspace和iptables两种实现方式。userspace是在用户空间,通过kuber-proxy实现负载均衡的代理服务。这个是kube-proxy的最初的版本,较为稳定,但是效率不太高。另外一种方式是iptables的方式,在内核空间,是纯采用iptables来实现LB,是Kubernetes目前默认的方式。
2) Kubernetes HA部署方案
部署了3个Master节点,每个Master节点的etcd组成集群
3个Master节点上的APIServer的前面放一个负载均衡器,工作节点和客户端通过这个负载均衡器和APIServer进行通信
scheduler和controller-manager支持leader选举,能保证在集群中多个实例只有一个工作,其他为备用
二、准备虚拟机软件和Linux OS
1.虚拟机软件安装(VirtualBox6.10)
//www.greatytc.com/p/7c1b9c24499d 2
2。Linux OS安装(Ubuntu20.04)
//www.greatytc.com/p/9f08d6e7c4ab
3。设置虚拟机的处理器数量至少为2
master节点处理器数量至少为2
node节点处理器数量可以为1
本实验只需要一个master节点和一个node节点
4.配置windows与ubuntu间的共享目录
在Ubuntu20.04中创建share目录
人工挂接
sudo mount -t vboxsf -o rw,uid=1000,gid=1000 share ~/share
启动时自动挂接
sudo vi /etc/fstab
在底下加一句
share /home/zhangwb/share vboxsf rw,gid=1000,uid=1000,auto 0 0
注意目录/home/zhangwb/share要换成实际的路径
4.配置国内源
备份sources.list文件
$ cd /etc/apt
$ sudo mv sources.list sources.list.bak
$ sudo vi /etc/apt/sources.list
//插入国内源(将附录的国内yum源放入到文件中)
$ sudo apt-getupdate
4.安装sshd
安装openssh-server
$ sudo apt-get install openssh-server
生成key
运行ssh-keygen生成公钥文件和私钥文件 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
ssh-keygen -t rsa
配置authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
cat ~/.ssh/authorized_keys
执行ssh
ssh localhost
三、安装前配置
本实验先安装好一台master机器,等所有软件都安装好之后,从master复制出来一个虚拟机作为node节点
1.规划主机名
规划主机名称
k8s-master
k8s-node1
k8s-node2
2.设置主机名
$ sudo hostnamectl set-hostname "k8s-master" // Run this command on masternode
$ cat /etc/hostname
k8s-master
$ sudo hostnamectl set-hostname "k8s-node1" // Run this command on node-0
$ sudo hostnamectl set-hostname "k8s-node2" // Run this command on node-1
3.配置 /etc/hosts
查看ip地址
$ ifconfig
//要是提示没有安装包时
$ sudo apt install net-tools
配置/etc/hosts
$ sudo vi /etc/hosts
10.1.13.106 k8s-master
#10.1.13.107 k8s-node1
#10.1.13.108 k8s-node1
将IP替换为实际的ip地址
4.禁用swap
$ sudo swapoff –a
$ sudo vi /etc/fstab
把/etc/fstab包含swap那行记录#掉。
5.关闭防火墙
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
6.禁用Selinux
$ sudo apt install selinux-utils
$ setenforce 0
7.确保时区和时间正确
$ sudo timedatectl set-timezone Asia/Shanghai
$ sudo systemctl restart rsyslog
$ sudo apt-get install ntpdate –y
$ sudo ntpdate time.windows.com
8.配置net.bridge.bridge-nf-call-iptables
$ cat <
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
9.设置rp_filter的值
$ sudo vi /etc/sysctl.d/10-network-security.conf
#将下面两个参数的值从2修改为1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
$ sudo sysctl --system
10.enable IP forwarding on all nodes
$ sudo vi /etc/sysctl.conf
// 找到net.ipv4.ip_forward=1” and un-comment it
$ sudo sysctl -p
net.ipv4.ip_forward = 1
四、安装docker
1.查看当前安装的docker版本
$ docker version
2.卸载当前安装的docker版本(可选)
$ sudo apt-get remove docker.io
3.查看可安装的docker版本(可选)
安装以下包以使apt可以通过HTTPS使用存储库(repository):
$ sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
添加Docker官方的GPG密钥:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg| sudo apt-key add –
再更新一下apt包索引:
$ sudo apt-get update
列出可用的版本:
$ apt-cache madison docker.io
4.安装docker
安装最新版
$ sudo apt install -y docker.io
安装特定版
sudo apt-get install docker.io=xxx
xxx为apt-cache madison docker.io输出中第二列完整的信息,如
sudo apt-get install docker.io=19.03.8-0ubuntu1.20.04.1
5.启动docker
启动docker
$ sudo systemctl start docker
设置开机自启动
$ sudo systemctl enable docker
或
$ sudo systemctl enable docker.service --now
6.验证docker
$ systemctl status docker
$ docker --version
7.重启docker(当有配置改动后执行)
$ sudo pkill -SIGHUP dockerd
//或者
$ sudo systemctl restart docker
8.配置docker镜像加速器
获取加速器地址
访问www.aliyun.com,支付宝登录,然后到https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors获取地址和安装方法
配置镜像加速器
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yyy.mirror.aliyuncs.com"]
}
EOF
yyy为上一步中阿里云展示的加速域名前缀
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
五、安装K8s软件
1.安装最新版本
$ sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl
$ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
$ sudo apt-get update
//安装最新版本
$ sudo apt-get install -y kubelet kubeadm kubectl
2.删除已安装版本
kubeadm version
sudo apt-get remove -y --allow-change-held-packages kubeadm kubectl kubelet kubernetes-cn
3.查询k8s可安装的版本:
apt-cache madison kubeadm
apt-cache madison kubelet
apt-cache madison kubectl
apt-cache madison kubernetes-cni
4.安装指定的k8s版本
sudo apt-get install -y kubelet=1.17.3-00 kubectl=1.17.3-00 kubernetes-cni=0.8.7-00 kubeadm=1.17.3-00
5.设置不随系统更新而更新
$ sudo apt-mark hold kubelet kubeadm kubectl
六、克隆nodes节点
1. 关闭虚拟机
$ sudo shutdown now
2. 复制虚拟机
回到Oracle VM VirtualBox主界面,选择k8s-master,右击鼠标,点击复制...
名称:k8s-node1
路径:选择合适的路径
MAC地址:为所有网卡重新生成MAC地址
下一步,选择完全复制
3. 重启虚拟机
k8s-master
k8s-node
4. 重新设置node主机名
$ sudo hostnamectl set-hostname "k8s-node1" // Run this command on node-1
$ cat /etc/hostname
3.配置 /etc/hosts
查看ip地址
$ ifconfig
4.配置/etc/hosts
$ sudo vi /etc/hosts
10.1.13.106 k8s-master
10.1.13.107 k8s-node1
七、初始化master(k8s-master节点上执行)
$ sudo kubeadm init --kubernetes-version=v1.17.3 --pod-network-cidr 10.244.0.0/16 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
注:
--kubernetes-version=v1.17.3 当安装的是最新版本时,这个参数可以省略
--pod-network-cidr 10.244.0.0/16 需要跟当前虚拟机的ip地址处于不同网段(ifconfig参考),并且与下面的网络插件参数设置要一致(calico.yaml中的CALICO_IPV4POOL_CIDR(原始值192.168.0.0/16))
执行成功后,会出现如下提示
执行
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 node
八、将node节点加入
在所有node节点上执行
sudo kubeadm join 192.168.3.164:6443 --token qqfpor.kxmumjmjnssqtg0o --discovery-token-ca-cert-hash sha256:20a02a32f27c13b4dddec7b4435370805c5bfd44186fbd25c9175a714e1e380e
其中:
192.168.3.164:6443 为master节点ip地址和端口
--token qqfpor.kxmumjmjnssqtg0o
这个参数可以通过在master上执行:kubeadm token list获得
--discovery-token-ca-cert-hash sha256:20a02a32f27c13b4dddec7b4435370805c5bfd44186fbd25c9175a714e1e380e
这个参数可以通过在master上执行:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 获得
kubectl get node
等装好网络插件就会Ready了
九、安装网络插件(calico)
#下载
https://docs.projectcalico.org/v3.11/manifests/calico.yaml
vi calico.yaml
#修改CALICO_IPV4POOL_CIDR,为10.244.0.0/16(要与kubeadm inti中的--pod-network-cidr 10.244.0.0/16参数保持一致,默认为192.168.0.0/16)
然后
$ kubectl apply -f calico.yaml
kubectl get node
需要等待一会,中间可以通过执行以下命令来查看pod是否全部ready
kubectl get pod -n kube-system
十、验证
1.创建nginxdeployment
$ kubectl create deployment nginx-web --image=nginx
2.获取pod列表
$ kubectl get pod -o wide
3.测试nginx
curl http://10.244.36.65