k8s集群与部署

一、K8s架构介绍

1.1 集群核心组件

核心组件说明 :

  • container:普通的docker容器,基于image运行,运行业务相关的应用
  • pod:包含有一个或多个container(共享网络),且有一个pod容器,与pod内的其他container关联,负责整个pod的健康检查
  • replicaset: 副本集,控制pod的运行数量
  • deployment:自动更新创建以及销毁rs副本集,实现pod的升级滚动更新;
  • service:基于label进行关联对应的pod,对外提供cluster_ip提供客户端访问入口;
1.2 集群架构设计

架构组件说明 :

  • master:集群主节点,负责管理worker节点
  • worker:集群工作节点,负责运行pod
  • etcd:集群状态数据库;
  • apiserver:操作k8s唯一入口,对外提供http/https的api
  • scheduler:调度器,收集每个节点的状态数据进行计算,从而关pod与节点的运行关系,然后告诉apiserver服务,然后apiserver存储到etcd;
  • controller Manger:集群内部控制中心,通过apiserver获取节点调度状态进行调度pod;
  • kubelet: 每一个worker节点上存在,负责维护pod的生命周期,最终调度docker运行起一个个的pod;

二、K8s集群搭建

2.1 架构说明
主机名 ip地址 角色
k8s-master 10.0.0.18 master
k8s-worker 10.0.0.19 worker
2.2 系统配置
#关闭swap分区
临时: swapoff -a
永久:注释/etc/fstab下的swap挂载

#配置hosts
[root@master ~]# cat /etc/hosts
10.0.0.18 k8s-master
10.0.0.19 k8s-worker

#安装依赖
yum -y install conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

#配置转发规则
iptables -F && iptables -X && iptables -X -t nat && iptables -F -t nat && iptables -P FORWARD ACCEPT

#调整内核参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
fs.inotify.max_user_watches = 100000
EOF
#
modprobe br_netfilter
sysctl -p  /etc/sysctl.d/k8s.conf

#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld

#关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 2>&1
2.3 安装docker
#安装依赖
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

#添加源
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

#安装服务(不建议直接安装最新版,后面k8s组件对版本有要求)
yum install -y docker-ce-19.03.10 docker-ce-cli-19.03.10 containerd.io-19.03.10
docker --version
#修改docker
#注:修改Cgroupfs 为 Systemd(docker文件驱动默认由cgroupfs 改成 systemd,与k8s保持一致避免conflict):

systemctl start docker
vim /etc/docker/daemon.json
#
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "graph": "/data/resource/docker"
}

#
systemctl restart docker
systemctl enable docker

#查看文件驱动,检查Cgroup是否为system
docker info | grep Driver
#graph设置docker目录,默认/var/lib/docker
[root@localhost ~]# cat /etc/docker/daemon.json 
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "graph": "/data/resource/docker",
  "registry-mirrors": ["http://ef017c13.m.daocloud.io"],
  "live-restore": true
}
#
systemctl daemon-reload
systemctl restart docker
2.4 部署k8s-master
#添加源

vim /etc/yum.repos.d/kubernetes.repo
#
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1

#安装k8s,这里的版本要和docker处于同一大版本中
#版本号查看:https://github.com/kubernetes/kubernetes/releases
yum remove -y kubelet kubeadm kubectl
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
systemctl enable kubelet
#初始化k8s集群
#参数解释
#service-cidr:为服务的虚拟 IP 地址另外指定 IP 地址段
#apiserver-advertise-address:API 服务器所公布的其正在监听的 IP 地址
#image-repository:选择用于拉取控制平面镜像的容器仓库
#pod-network-cidr:指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。
#kubernetes-version:为控制平面选择一个特定的 Kubernetes 版本
#ignore-preflight-errors=all:错误将显示为警告的检查列表;例如:'IsPrivilegedUser,Swap'。取值为 'all' 时将忽略检查中的所有错误

kubeadm init --kubernetes-version=1.19.3 \
--apiserver-advertise-address=10.0.0.18  \
--image-repository registry.aliyuncs.com/google_containers  \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all


#初始化完成后,根据提示进行执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看镜像
docker images

#使用kubectl命令查看节点信息
kubectl get node
2.5 安装flannel网络
#执行yaml
wget -c https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
docker pull quay.io/coreos/flannel:v0.13.1-rc2
kubectl apply -f kube-flannel.yml


#查看master节点状态
kubectl get node
kubectl get pods -n kube-system
kubectl get node
2.6 部署worker节点
#添加源
vim /etc/yum.repos.d/kubernetes.repo
#
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1

#
yum install -y kubelet-1.19.3 kubectl-1.19.3
systemctl enable kubelet


#加入集群,该指令是master节点初始化时生成
kubeadm join 10.0.0.18:6443 --token z8hmui.gcppl5081q87s7y4 \
    --discovery-token-ca-cert-hash sha256:da76db14332b94bcb26f23a12d1dca3bab5d884edcde4fe1765b796c1ef1b810 --ignore-preflight-errors=all


#在k8s-master查看集群节点数
kubectl get nodes
2.7 部署dashboard
#拉取镜像
#https://github.com/kubernetes/dashboard
#https://hub.docker.com/r/kubernetesui/dashboard/tags?page=1&ordering=last_updated
#https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
docker pull kubernetesui/dashboard:v2.1.0

#修改service模式
vim kubernetes-dashboard.yaml
#
---文件顶部修改

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  type: NodePort #添加一行参数,默认是用在集群访问模式,需要暴露给外部用户
  ports:
    - port: 8000
      targetPort: 8000
      nodePort: 30001 #添加一行参数,暴露的端口
  selector:
    k8s-app: dashboard-metrics-scraper


#启动服务
kubectl apply -f kubernetes-dashboard.yaml

#访问页面#创建用户
#创建service account并绑定默认cluste-admin管理员角色
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin

#使用输出的token登陆dashboard
kubectl describe secrets -n kubernetes-dashboard $(kubectl -n kubernetes-dashboard get secret |awk '/dashboard-admin/{print $1}')
2.8 测试集群
#生成nginx-yaml的deployment
kubectl create deployment nginx --image=nginx:latest \
--dry-run -o yaml > nginx.yaml

#运行服务
kubectl apply -f nginx.yaml

#生成nginx外部svc配置
# -name :svc的名称,默认不加与deployment同名
# deployment:指定关联的deployment
# --port :pod的端口
# --target-port:pod中应用的端口
# --type:暴露类型

kubectl expose --help
kubectl expose --name=nginx deployment nginx --port 80 --target-port=80 --type=NodePort --dry-run -o yaml > svc_nginx.yaml

#对外采用nodeport,所有访问节点即可
curl -I http://10.0.0.19:31007/