K8s基础

一.概念

k8s是一个容器管理编排系统,建立在容器之上,k8s有如下特性:

  1. 服务发现和负载均衡:k8s中存在容器与容器间的访问,而k8s可以把他们统一管理起来,当需要访问的时候,k8s会去判断容器的状态是否可以访问,类似于nacos一样,相同的服务可能不在同一个容器中,当访问过来,k8s会根据容器的访问流量来做做负载均衡;
  2. 存储编排:k8s会对存储资源做统一管理,当删除容器的时候,它也会统一释放存储资源;
  3. 自动化部署和回滚
  4. 自动完成装箱计算:k8s允许指定容器所需的cpu和内存资源
  5. 自我修复:当k8s启动失败或者服务器宕机了,会自动重启,或者转移容器
  6. 密钥与配置管理:k8s可以统一管理容器的配置,类似于nacos配置中心; 

二.基础架构

由n个master+n个node组成,n>=1

个人理解的架构图

master-node组件:

  1. kube-apiserver:该组件公开了 Kubernetes API,前端调度组件,可以启动,删除容器,获取容器状态等;

  2. etcd:k-v数据库,记录集群中容器的状态等;

  3. kube-scheduler:负责监视新创建的、未指定运行节点的pod,选择节点让 Pod 在上面运行;

  4. kube-controller-manager:在主节点上运行控制器的组件。

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
  • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

work-node组件

  1. kubelet:负责运行pod,并且监控其运行状态;
  2. kube-proxy:负责网络请求路由到对应的应用节点 ;

三. 集群部署

首先购买云服务器,这以一个master-node和两个work-node为例,在每台机器上都安装上docker。

1.移除以前安装的docker安装包(若未安装过可以跳过) 

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

 2.配置yum源

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3.docker 安装

#安装最新版
sudo yum install -y docker-ce docker-ce-cli containerd.io


#安装指定版本
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6

安装成功后可通过docker -v查看

通过 systemctl status docker 查看docker 运行状态

 4.启动docker 

systemctl enable docker --now

 5.配置阿里云镜像加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://b66nkcgc.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

通过docker info命令查看加速地址

6.设置k8s基础环境

# 设置机器各自的域名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

#关闭swap
swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab

#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system

7.安装kubelet、kubeadm、kubectl 

# 配置k8s安装地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

# 安装kubelet kubeadm kubectl
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

#启动kubelet
sudo systemctl enable --now kubelet

8.下载各个机器需要的镜像

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF
   
chmod +x ./images.sh && ./images.sh

9.初始化主节点

#所有机器添加master域名映射,以下需要修改为自己的
echo "172.31.0.4  cluster-master" >> /etc/hosts
#主节点初始化
kubeadm init \
--apiserver-advertise-address=172.31.0.4 \
--control-plane-endpoint=cluster-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-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

 安装网络插件

curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

查看节点状态

 加入节点

kubeadm token create --print-join-command
执行上面的命令生成令牌
kubeadm join cluster-master:6443 --token 44poxh.rkx3dizmx606s8fz     --discovery-token-ca-cert-hash sha256:e1e428a1fb2b8aa1a32227042b1f9599e1343800354f3a5de714b6322c76c64a

查看pod运行状态

kubectl get pod -A

从上述可以看出calico并未启动成功,可以删除pod

kubectl delete pod calico-node-xfmgp -n kube-system

查看该pod的启动日志

kubectl describe pod/calico-node-xfmgp -n kube-system

 注意:k8s版本应与calico版本相对应,否则启动不成功,此次k8s版本1.20.9,calico版本为3.2

 加入节点时报错

 需执行 kubeadm reset

 最终全部启动成功

10. 部署官方可视化界面

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

 运行成功结果:

设置访问端口:

# type: ClusterIP 改为 type: NodePort
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

查看端口:

kubectl get svc -A |grep kubernetes-dashboard

 访问页面:

创建访问账号

#创建访问账号,准备一个yaml文件; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard



kubectl apply -f dash.yaml

 获取访问令牌:

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

 至此,k8s 的集群搭建完毕!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值