kubeadm搭建

一、kubeadm创建集群

请参照以前Docker安装。先提前为所有机器安装Docker

1、安装kubadm

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令

  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)

  • 2 CPU 核或更多

  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)

    • 设置防火墙放行规则
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。

    • 设置不同hostname
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。

    • 内网互信
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

    • 永久关闭

1、基础环境

所有机器执行以下操作

#各个机器设置自己的域名
hostnamectl set-hostname xxxx


# 将 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

2、安装kubelet、kubeadm、kubectl

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

# 指定安装版本
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

PS:kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环

2、使用kubeadm引导集群

1、下载各个机器需要的镜像

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

2、初始化主节点

#所有机器添加master域名映射,以下需要修改为自己的(让所有机器知道主节点地址)
echo "192.168.10.31  master1" >> /etc/hosts


#主节点初始化
kubeadm init \
--apiserver-advertise-address=192.168.10.31 \
--control-plane-endpoint=master1 \
--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=10.10.0.0/16

#所有网络范围不重叠
参数解释
--apiserver-advertise-address主机点的IP地址
--control-plane-endpoint主节点的主机名称
--image-repository镜像地址
--kubernetes-versionkubernetes版本
--service-cidrk8s集群内部对大量服务进行负载均衡的网络范围
--pod-network-cidrk8s集群内部对大量服务进行负载均衡的网络范围

下面是初始化完成

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

# 初始化集群完成后先操作这3步
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

# 需要部署一个网络插件
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

# 当作主节点加入集群
  kubeadm join master1:6443 --token 1iv154.hajr21x2aa1cb085 \
    --discovery-token-ca-cert-hash sha256:83d5200f847c52574ec9e2becfa8dadaf32adb721399239562756115b34c3306 \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

# 当作工作节点加入集群
kubeadm join master1:6443 --token 1iv154.hajr21x2aa1cb085 \
    --discovery-token-ca-cert-hash sha256:83d5200f847c52574ec9e2becfa8dadaf32adb721399239562756115b34c3306 
[root@master1 ~]# mkdir -p $HOME/.kube
[root@master1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master1 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master1 ~]# kubectl get nodes
NAME      STATUS     ROLES                  AGE     VERSION
master1   NotReady   control-plane,master   3d22h   v1.20.9

2.1、安装网络插件

calico官网

[root@master1 ~]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  212k  100  212k    0     0  30832      0  0:00:07  0:00:07 --:--:-- 35250

[root@master1 ~]# ls
anaconda-ks.cfg  calico.yaml  images.sh

[root@master1 ~]# kubectl apply -f calico.yaml

下面是配置文件

calico.yaml

如果上面初始化主节点时修改过POD的IP,去掉注释,替换为修改的pod的IP

[)]
在这里插入图片描述

kubectl常用命令(查看节点和应用状态)

# 查看集群所有节点
kubectl get nodes

# 查看集群部署了哪些应用
docker ps
kubectl get pods -A

kubeadm 生成的token过期后,集群增加节点

在这里插入图片描述

在这里插入图片描述

生成token

[root@k8s-master1 ~]# kubeadm token create --print-join-command --ttl=0
kubeadm join master1:6443 --token 2uikx9.17vow5i1h4k6bf6u     --discovery-token-ca-cert-hash sha256:83d5200f847c52574ec9e2becfa8dadaf32adb721399239562756115b34c3306 

说明:
–ttl=0代表时间永不过期,不加此参数默认24小时过期

node节点加入集群

[root@node1 ~]# kubeadm join --token 5qtmh7.3ux095roh6cqn3yz --discovery-token-ca-cert-hash sha256:83d5200f847c52574ec9e2becfa8dadaf32adb721399239562756115b34c3306  master1:6443

master节点加入集群需要输入以下步骤

在master上生成用于新master加入的证书

[root@master1 ~]# kubeadm init phase upload-certs --upload-certs
I1110 16:05:46.973918  238162 version.go:254] remote version is much newer: v1.22.3; falling back to: stable-1.20
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
4f3b592cb3606104d0edcd18e35ced06d35810fefe618e309605a9ec655b335e

master节点加入集群

kubeadm join master1:6443  --token 5qtmh7.3ux095roh6cqn3yz \
  --discovery-token-ca-cert-hash sha256:83d5200f847c52574ec9e2becfa8dadaf32adb721399239562756115b34c3306 \
  --control-plane --certificate-key 4f3b592cb3606104d0edcd18e35ced06d35810fefe618e309605a9ec655b335e

查看集群状态

[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES                  AGE     VERSION
master1   Ready    control-plane,master   5d21h   v1.20.9
master2   Ready    control-plane,master   20h     v1.20.9
node1     Ready    <none>                 22h     v1.20.9
node2     Ready    <none>                 21h     v1.20.9

3、集群部署dashboard

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

recommended.yaml

设置访问端口

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard

type: ClusterIP 改为 type: NodePort

在这里插入图片描述

# 找到端口,在安全组放行
[root@master1 ~]# kubectl get svc -A |grep kubernetes-dashboard
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.96.56.238   <none>        8000/TCP                 17m
kubernetes-dashboard   kubernetes-dashboard        NodePort    10.96.173.93   <none>        443:31436/TCP            17m

访问: https://集群任意IP:端口 https://192.168.10.31:31436

创建访问账号,准备一个yaml文件; vi dashadm.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
[root@master1 ~]# kubectl apply -f dashadm.yaml 
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

获取访问令牌

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}}"

在这里插入图片描述

在这里插入图片描述

二、kubernetes核心实战

1、资源创建方式

  • 命令行
  • YAML

2、Namespace

名称空间用来隔离资源

# 创建名称空间hello
kubectl create ns hello

# 删除名称空间hello
kubectl delete ns hello

yaml创建名称空间

vim hellons.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: hello

apiVersion: v1 == 版本号

kind: Namespace == 资源类型(此资类型是名称空间)

metadata: == 元数据

name: hello == 名称空间名字

# 创建名称空间hello
kubectl appyl -f hellone.yaml

# 删除名称空间hello
kubectl delete -f hellone.yaml

3、Pod

运行中的一组容器,Pod是kubernetes中应用的最小单位.

命令行创建nginx应用

kubectl run mynginx --image=nginx

# 查看default名称空间的Pod
kubectl get pod 

# 描述
kubectl describe pod 你自己的Pod名字

# 删除
kubectl delete pod Pod名字

# 查看Pod的运行日志
kubectl logs Pod名字

# 每个Pod - k8s都会分配一个ip
kubectl get pod -o wide
# 使用Pod的ip+pod里面运行容器的端口
curl 192.168.169.136

# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod

run == 启动应用

mynginx == 给应用起一个名字

–image=nginx == 使用了nginx镜像创建

默认在default名称空间

描述Pod启动状态

kubectl describe pod mynginx

在这里插入图片描述

描述内容为:

Scheduled 第一步,把这个应用放到node2节点中去

Pulling 第二步,在node2节点里下载nginx镜像

Pulled 第三步,nginx镜像下载完成

Created 第四步,创建mynginx容器

Started 第五步,启动mynginx容器

yaml文件创建nginx应用

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat:8.5.68
    name: tomcat

apiVersion: v1 == 版本号

kind: Pod == 资源类型(此资类型是Pod)

metadata: == 元数据

labels: == 固定写法

​ run: myapp == 启动容器

name: myapp == 容器名字

spec: == Pod的详细配置信息

containers: == 容器的配置

- image: nginx == 使用的镜像

​ name: nginx

posted @ 2022-09-16 15:19  雪花凌落的盛夏  阅读(20)  评论(0编辑  收藏  举报  来源