kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
之前没有写,主要是早几年公司关于k8s的部署80%都是二进制的,因为他更具体,详细,能让运维人员了解每一个组件的交互及原理,随着时间的推移,慢慢的Kubeadm进入我们的世界,他可以简单到 2条命令就可以部署集群,解放了我们的双手,但目前还不完成可以应用于生产,请各位珍重。
下面我们就来,体验一下Kubeadm部署集群的快感。
一、部署准备工作
在开始之前,我们需要对服务器进行一些标准化的设置,有如下几点:
1,环境介绍
服务器系统 | IP | 主机名 | 配置 | 网络情况 | Docker版本 |
---|---|---|---|---|---|
CentOS7.7 x86_64 | 192.168.1.233 | master | 2C2G | 内网互通,外网正常 | 18.06.1-ce |
CentOS7.7 x86_64 | 192.168.1.234 | node01 | 2C2G | 内网互通,外网正常 | 18.06.1-ce |
CentOS7.7 x86_64 | 192.168.1.235 | node02 | 2C2G | 内网互通,外网正常 | 18.06.1-ce |
2,部署目标
- 在所有节点上安装
Docker
和Kubeadm
,kubelet
除了最后一个,其它组件都是docker容器运行,因为它的支持不完美。 - 部署K8S Master
- 部署容器网络插件flannel
- 部署K8S node,将节点加入K8S集群
- 部署Dashboard web页面,可视化查看k8s资源
3,K8s架构图展示
二、K8s 集群部署
1,Master和Nodes 都需要操作
## NTP时间同步
yum -y install ntp
/usr/sbin/ntpdate cn.pool.ntp.org
echo "* 4 * * * /usr/sbin/ntpdate cn.pool.ntp.org > /dev/null 2>&1" >> /var/spool/cron/root
systemctl restart crond.service
## 关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
##关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
# 关闭swap:
swapoff -a #临时
sed -i 's/^[^#].*swap*/#&/g' /etc/fstab #永久关闭
#开启路由转发
echo "1" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
#添加主机名与IP对应关系(记得设置主机名):
cat > /etc/hosts << EOF
192.168.1.233 k8s-master
192.168.1.234 k8s-node1
192.168.1.235 k8s-node2
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 #修改生效
安装docker
因为docker是k8s的基础,所以我们先安装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
docker --version
Docker version 18.06.1-ce, build e68fc7a
统一镜像源
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=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装 kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
yum install -y kubelet-1.14.0 kubeadm-1.14.0 kubectl-1.14.0
systemctl enable kubelet #添加开启自启动
2,Master操作 初始化K8s master
初始化的作用:让k8s有了集群
的基础
kubeadm init \
--apiserver-advertise-address=192.168.1.233 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.14.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
参数介绍:
--apiserver-advertise-address #指定Master的api组件IP地址,用于与其它节点通信,多网卡选择内网地址即可,这里也有人填写lb的vip。
--image-repository #指定一个仓库,最好国内源相对快
--kubernetes-version #指定k8s版本
--pod-network-cidr #指定pod网络地址,分配到每个node上
--service-cidr #指定service网络地址段,可以理解为1个负载均衡的虚拟IP
--ignore-preflight-errors #忽略swap错误
初始化完成后,会生成一个token,`复制下来,后面使用`:
kubeadm join 192.168.1.233:6443 --token o92aqu.cr4bka50f6nk5vrw \
--discovery-token-ca-cert-hash sha256:03616c7f0f8b6a2998cc34fa3ecdeb41d30fca9064d13bf362d0aaf80c7e82c2
所需docker镜像
使用kubectl工具:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #kubeadm自动初始化好的一个被kubectl拿来作为配置文件,指定连接至k8sapiserver,并完成认证的配置文件
sudo chown $(id -u):$(id -g) $HOME/.kube/config #如果是普通用户需要使用此操
$ kubectl get nodes #在root 家目录执行
安装Pod网络插件(Cni组件flannel)
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
#如果节点状态不正常,看下镜像是否下载成功,可以手动下载解决此问题
#确保能够访问到quay.io这个registery
三、Node节点配置 (将node加入集群)
node就是你运行任务的地方,master是去管理node的。
1. 初始化node
# 下面这个命令就是上面复制的token,执行就可以了,IP为node节点IP
# 原理:Token是kubeamd在master上创建了一个访问权限,然后node拿这个访问权限,来访问APIserver,然后apiserver来颁发证书 ,在然后就node就加入集群中了
kubeadm join 192.168.1.233:6443 --token o92aqu.cr4bka50f6nk5vrw --discovery-token-ca-cert-hash sha256:03616c7f0f8b6a2998cc34fa3ecdeb41d30fca9064d13bf362d0aaf80c7e82c2
#由于我的master NTP之前有问题,我把kubeadm reset 然后重新生成的证书。
# 如果报错说docker-cgroup类型,改为systemd
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
查看集群状态
去Master
查看node节点状态
kubectl get nodes ##如果状态为Ready为正常
kubectl get pods -n kube-system ##如果状态为Running为正常,有点忙稍等。。
否则去节点上journalctl -f -u kubelet 查看日志
测试K8s集群
kubectl create deployment nginx --image=nginx #deploment是控制器 image是镜像
kubectl expose deployment nginx --port=80 --type=NodePort #service是暴露端口,提供外部访问
kubectl get pods,svc -o wide
-o #查看详细信息
浏览器访问
访问地址:http://NodeIP:Port
四、部署Web UI (Dashboard)
QQ群共享下载 kubernetes-dashboard.yaml 文件
$ kubectl apply -f kubernetes-dashboard.yaml
1,镜像改成国内,
2,默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kube-system 多租户隔离
查看端口
kubectl get pods,svc -n kube-system
自签证书不授信,添加到白名单即可。
创建service account并绑定默认cluster-admin管理员集群角色:
本次测试token,用于区别身份
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
#第一条创建1个serviceaccount 后面是名字
#第二条 将上面创建的count 绑定到 dashboard-admin 角色中,例如 windows admin
# token通过secret保存下来,注意命名空间的用法
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
登陆web界面
五、简单优化
自动补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
文件位置
证书位置:/etc/kubernetes/pki/
kubelet配置文件位置:/var/lib/kubelet/config.yaml
各配置文件:/etc/kubernetes/
静态pod文件存储位置:/etc/kubernetes/manifests/
集群初始化,安装两个插件
CoreDNS # 提供整个集群的dns
k8s经历了三版dns:1.sky_dns 2. kube-dns 3. core-dsn
kube-proxy# server内部的服务发现和负载均衡
最后感谢李振良的公开课热心分享。
- QQ精品交流群
-
- 微信公众号
-