Kubeadm快速部署K8s集群

2019年10月11日16:10:44 发表评论 3,280 views
广告也精彩

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,部署目标

  • 在所有节点上安装DockerKubeadmkubelet 除了最后一个,其它组件都是docker容器运行,因为它的支持不完美。
  • 部署K8S Master
  • 部署容器网络插件flannel
  • 部署K8S node,将节点加入K8S集群
  • 部署Dashboard web页面,可视化查看k8s资源

3,K8s架构图展示

Kubeadm快速部署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

Kubeadm快速部署K8s集群

所需docker镜像
Kubeadm快速部署K8s集群

使用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 家目录执行

Kubeadm快速部署K8s集群

安装Pod网络插件(Cni组件flannel)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

#如果节点状态不正常,看下镜像是否下载成功,可以手动下载解决此问题
#确保能够访问到quay.io这个registery

Kubeadm快速部署K8s集群
Kubeadm快速部署K8s集群

三、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 查看日志

Kubeadm快速部署K8s集群

测试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 #查看详细信息

Kubeadm快速部署K8s集群

浏览器访问

访问地址:http://NodeIP:Port
Kubeadm快速部署K8s集群
Kubeadm快速部署K8s集群

四、部署Web UI (Dashboard)

QQ群共享下载 kubernetes-dashboard.yaml 文件

$ kubectl apply -f kubernetes-dashboard.yaml

1,镜像改成国内,
2,默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

kube-system 多租户隔离

Kubeadm快速部署K8s集群

查看端口

kubectl get pods,svc -n kube-system

自签证书不授信,添加到白名单即可。

Kubeadm快速部署K8s集群

创建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}')

Kubeadm快速部署K8s集群
Kubeadm快速部署K8s集群

登陆web界面

Kubeadm快速部署K8s集群

五、简单优化

自动补全

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精品交流群
  • weinxin
  • 微信公众号
  • weinxin
广告也精彩
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: