搭建K8s集群 K8S



  • 修改ubuntu配置

  • 安装docker

  • 安装kubeadm、kubectl以及kubelet

  • 初始化master节点

  • 将slave节点加入网络


  • kubelet: k8s 的核心服务

  • kubeadm: 这个是用于快速安装 k8s 的一个集成工具,我们在master1和worker1上的 k8s 部署都将使用它来完成。

  • kubectl: k8s 的命令行工具,部署完成之后后续的操作都要用它来执行


 kubeadm —— 启动 k8s 集群的命令工具

 kubelet —— 集群容器内的命令工具

 kubectl —— 操作集群的命令工具


#配置免密登录


#关闭 swap,不关闭的话, k8s 会报错

modprobe br_netfilter
echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
swapoff -a
vim /etc/fstab # 注释掉 # /swapfile none swap sw 0 0


systemctl stop NetworkManager

systemctl disable NetworkManager

iptables -F


ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

echo 'LANG="en_US.UTF-8"' >> /etc/profile;source /etc/profile


#所有节点以master时间为准,使用ntp定时去同步master的时间

yum install ntp ntpdate -y

vim /etc/ntp.conf


---master

driftfile /var/lib/ntp/drift

restrict 127.0.0.1

restrict ::1

restrict 10.8.31.66 mask 255.255.255.0 nomodify notrap

service  172.170.1.0

fudge 127.127.1.0 stratum 10

---node

service  10.8.31.66 


systemctl start ntpd


#debian

# 优化,安装docker
sudo apt update -y;
sudo apt-get install -y wget vim net-tools curl git cron -y && sudo apt upgrade -y  && sudo apt dist-upgrade -y && sudo apt autoremove && sudo apt clean;
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun;
sudo usermod -aG docker ubuntu;
sudo docker version;
sudo mkdir -p /etc/docker/
sudo chmod -R 777  /etc/docker/
sudo cat >> /etc/docker/daemon.json << EOF
{ 
 "exec-opts": ["native.cgroupdriver=systemd"],   
 "insecure-registries": ["hub.htmltoo.com:5200","hub.htmltoo.com:5200"],
 "storage-driver": "overlay2"
}
EOF
sudo systemctl restart docker
sudo docker info | grep "Cgroup Driver"

kubernetes官方建议docker驱动采用systemd,因为更稳定


#内核开启ipv4转发, 允许内置路由

echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl --system
sysctl -p



#安装kubelet kubeadm kubectl

#国外-创建kubernetes的repo
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update

#国内-创建kubernetes的repo
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
sudo apt-get update

#查看可用软件版本
apt-cache madison kubeadm
kubeadm | 1.20.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
....
apt-cache madison kubectl
kubectl | 1.20.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
...
apt-cache madison kubelet
kubelet | 1.20.4-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
...
apt-cache madison kubernetes-cni
kubernetes-cni | 0.8.7-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
#安装指定版本
sudo apt-get install -y kubelet=1.20.4-00 kubeadm=1.20.4-00 kubectl=1.20.4-00 kubernetes-cni=0.8.7-00
sudo apt-mark hold kubelet=1.20.4-00 kubeadm=1.20.4-00 kubectl=1.20.4-00  kubernetes-cni=0.8.7-00
sudo systemctl enable kubelet && sudo systemctl start kubelet

#加载IPVS内核,并添加到开机启动文件里
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
echo "modprobe ip_vs_rr" >> /etc/rc.local
echo "modprobe ip_vs_wrr" >> /etc/rc.local
echo "modprobe ip_vs_sh" >> /etc/rc.local


#安装之后查看版本
kubelet --version
Kubernetes v1.20.4
#kubelet的驱动是在kubeadm join初始化的时候与docker保持一致的systemd,docker修改了,kubelet也需要修改
sudo sed -i 's/--cgroup-driver=cgroupfs/--cgroup-driver=systemd/g' /var/lib/kubelet/kubeadm-flags.env 
sudo systemctl restart kubelet
sudo systemctl status kubelet


#centos

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
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
# 卸载旧版本
yum remove -y kubelet kubeadm kubectl
# 安装
yum install -y kubectl kubelet kubeadm  --disableexcludes=kubernetes
yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0 --disableexcludes=kubernetes
# 开机启动
systemctl enable kubelet
# 启动
systemctl start kubelet
# kubelet命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile


kubelet --version

# 卸载旧版本

yum remove -y kubelet kubeadm kubectl

yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0 kubernetes-cni --disableexcludes=kubernetes

yum install -y kubelet kubeadm kubectl kubernetes-cni --disableexcludes=kubernetes


#其他组件安装

kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.20.4
k8s.gcr.io/kube-controller-manager:v1.20.4
k8s.gcr.io/kube-scheduler:v1.20.4
k8s.gcr.io/kube-proxy:v1.20.4
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0


Kubernetes主要由以下几个核心组件组成:

etcd保存了整个集群的状态;

apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

kubeadm init这个命令帮助你启动跟Master相关的组件APIServer、Etcd、Scheduler、Controller-Manager等。由于官方镜像地址被墙,所以我们需要首先获取所需镜像以及它们的版本。然后从国内镜像站获取。


vim /etc/hosts

192.168.133.133 master
192.168.133.134 node1


# master节点配置


-使用kubeadm init自动安装 Master 节点,需要指定版本

kubeadm init --kubernetes-version=1.15.0

-根据输出提示,进行配置

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

-安装pod网络插件

https://github.com/weaveworks/weave/releases/

kubectl apply -f  https://github.com/weaveworks/weave/releases/download/v2.6.5/weave-daemonset-k8s-1.6.yaml

https://github.com/flannel-io/flannel/releases

-For Kubernetes v1.17+ 

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


# 检查是否正常启动

kubectl get pods --all-namespaces
  • ---故障排查思路:
  • 确认端口和容器是否正常启动,查看 /var/log/message日志信息
  • 通过docker logs ID查看容器的启动日志,特别是频繁创建的容器
  • 使用kubectl --namespace=kube-system describe pod POD-NAME查看错误状态的pod日志。
  • 使用kubectl -n ${NAMESPACE} logs ${POD_NAME} -c ${CONTAINER_NAME}查看具体错误。
  • Calico - Canal - Flannel已经被官方验证过,其他的网络插件有可能有坑,能不能爬出来就看个人能力了。
  • 一般常见的错误是镜像名称版本不对或者镜像无法下载。


# 安装node节点

使用master初始化成功后的kubeadm join命令,添加node节点

kubeadm join 10.10.10.114:6443 --token mt25rk.bdjza4pmykjw7b15 --discovery-token-ca-cert-hash

sha256:3ad1256fa4db508487a4e56a37680ace8c6b2793088e38e3d6363042af154c4f

---如果执行join命令时提示token过期,按照提示在Master 上执行kubeadm token create生成一个新的token。

如果忘记token,可以使用kubeadm token list查看。


# 执行添加命令后,在master节点查看节点信息

kubectl get nodes

kubectl get pods --all-namespaces

kubectl describe pod POD_NAME


---可以把master节点的配置文件放到node节点上面,方便node节点使用kubectl。

scp /etc/kubernetes/admin.conf  172.18.8.201:/root/.kube/config


---创建几个pod看看。

kubectl run nginx --image=nginx --replicas=3

kubectl get pods -o wide


--- 查看集群

kubectl cluster-info

Kubernetes master is running at https://10.10.10.114:6443

KubeDNS is running at https://10.10.10.114:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


---检查集群的地址和凭证

kubectl config view

apiVersion: v1
clusters:

- cluster:
  certificate-authority-data: DATA+OMITTED
  server: https://10.10.10.114:6443
  name: kubernetes
  contexts:
- context:
  cluster: kubernetes
  user: kubernetes-admin
  name: kubernetes-admin@kubernetes
  current-context: kubernetes-admin@kubernetes
  kind: Config
  preferences: {}
  users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED

kubectl get po # 查看目前所有的pod

kubectl get rs # 查看目前所有的replica set

kubectl get deployment # 查看目前所有的deployment

kubectl describe po my-nginx # 查看my-nginx pod的详细状态

kubectl describe rs my-nginx # 查看my-nginx replica set的详细状态

kubectl describe deployment my-nginx # 查看my-nginx deployment的详细状态

kubectl get eventskubectl get events查看相关事件

kubectl delete deployment my-nginx


# 添加dashboard

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


===================

#master节点安装配置Kubernetes

---初始化 master 节点

sudo kubeadm init --kubernetes-version=v1.20.4 --pod-network-cidr=10.244.0.0/16   --ignore-preflight-errors=all   


初始化 master 节点

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
-k8s.gcr.io可以访问的情况下可以直接执行init
sudo kubeadm init --apiserver-advertise-address=10.187.20.141 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all

--apiserver-advertise-address: k8s 中的主要服务apiserver的部署地址,填自己的管理节点 ip
--image-repository: 拉取的 docker 镜像源,因为初始化的时候kubeadm会去拉 k8s 的很多组件来进行部署,所以需要指定国内镜像源,下不然会拉取不到镜像。
--pod-network-cidr: 这个是 k8s 采用的节点网络,因为我们将要使用flannel作为 k8s 的网络,所以这里填10.244.0.0/16就好
--kubernetes-version: 这个是用来指定你要部署的 k8s 版本的,一般不用填,不过如果初始化过程中出现了因为版本不对导致的安装错误的话,可以用这个参数手动指定。
--ignore-preflight-errors: 忽略初始化时遇到的错误,比如说我想忽略 cpu 数量不够 2 核引起的错误,就可以用--ignore-preflight-errors=CpuNum。错误名称在初始化错误时会给出来。


初始化成功了,请把最后那行以kubeadm join开头的命令复制下来,之后安装工作节点时要用到的,如果你不慎遗失了该命令,可以在master节点上使用kubeadm token create --print-join-command命令来重新生成一条。


任何Error导致初始化终止了,使用kubeadm reset重置之后再重新进行初始化


# 初始化 Control-plane/Master 节点
kubeadm init \
    --apiserver-advertise-address 0.0.0.0 \
    # API 服务器所公布的其正在监听的 IP 地址,指定“0.0.0.0”以使用默认网络接口的地址
    # 切记只可以是内网IP,不能是外网IP,如果有多网卡,可以使用此选项指定某个网卡
    --apiserver-bind-port 6443 \
    # API 服务器绑定的端口,默认 6443
    --cert-dir /etc/kubernetes/pki \
    # 保存和存储证书的路径,默认值:"/etc/kubernetes/pki"
    --control-plane-endpoint kuber4s.api \
    # 为控制平面指定一个稳定的 IP 地址或 DNS 名称,
    # 这里指定的 kuber4s.api 已经在 /etc/hosts 配置解析为本机IP
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    # 选择用于拉取Control-plane的镜像的容器仓库,默认值:"k8s.gcr.io"
    # 因 Google被墙,这里选择国内仓库
    --kubernetes-version 1.17.3 \
    # 为Control-plane选择一个特定的 Kubernetes 版本, 默认值:"stable-1"
    --node-name master01 \
    #  指定节点的名称,不指定的话为主机hostname,默认可以不指定
    --pod-network-cidr 10.10.0.0/16 \
    # 指定pod的IP地址范围
    --service-cidr 10.20.0.0/16 \
    # 指定Service的VIP地址范围
    --service-dns-domain cluster.local \
    # 为Service另外指定域名,默认"cluster.local"
    --upload-certs
    # 将 Control-plane 证书上传到 kubeadm-certs Secret
-不带注释的内容如下,如果初始化超时,可以修改DNS为8.8.8.8后重启网络服务再次尝试。
kubeadm init \
 --apiserver-advertise-address 0.0.0.0 \
 --apiserver-bind-port 6443 \
 --cert-dir /etc/kubernetes/pki \
 --control-plane-endpoint kuber4s.api \
 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
 --kubernetes-version 1.17.3 \
 --pod-network-cidr 10.10.0.0/16 \
 --service-cidr 10.20.0.0/16 \
 --service-dns-domain cluster.local \
 --upload-certs


在master节点上:

kubeadm init

第一次执行等待时间比较长,卡在(Created API client, waiting for the control plane to become ready)

解决办法:

-忽略所有错误启动

sudo kubeadm init --ignore-preflight-errors=all     


---设置环境变量,配置 kubectl 工具

-在 kubectl init 之后

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown -R ubuntu:ubuntu /home/ubuntu/.kube
sudo kubectl get pod -o wide
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile  && source ~/.bash_profile

sudo kubeadm reset

sudo kubeadm init

sudo systemctl status kubelet

sudo journalctl -xeu kubelet

sudo systemctl daemon-reload && sudo systemctl restart kubelet

sudo kubeadm init --ignore-preflight-errors=all


---安装flannel

cd /opt

sudo wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

sudo kubectl apply -f kube-flannel.yml 

sudo wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml

sudo kubectl apply -f kube-flannel-rbac.yml 


---测试环境使用单机集群,可以使用如下命令,让 master 上也可以有 pod

可以将一个master节点映射为一个node节点

sudo kubectl taint nodes --all node-role.kubernetes.io/master- 


#在node节点上安装配置


---kubeadm join 加入集群

kubeadm join 10.187.20.141:6443 --token 3u8lll.wgwpcd5s6obfrtfl \

    --discovery-token-ca-cert-hash sha256:c8dc865191a554b3902852f1d04cf1f43d1095fcbea8014f542c0048261c88af 

-同样通过加运行参数,忽略错误

 --ignore-preflight-errors=all

---在master节点上查看

kubectl get nodes


测试 kubectl是否可用

# 查看已加入的节点

kubectl get nodes

# 查看集群状态

kubectl get cs

删除节点

首先释放 bogon 节点资源

kubectl drain bogon --delete-local-data --force --ignore-daemonsets

删除 bogon 节点

kubectl delete node bogon


部署 flannel 网络, 将 slave 节点加入网络

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如无法连接,更改vim /etc/hosts
# 加入 151.101.76.133 raw.githubusercontent.com
kubectl apply -f kube-flannel.yml
# 将worker node加入到master 这个在节点机操作,这个命令是master主机初始化完成后的那最后几行
kubeadm join 192.168.133.137:6443 --token h5wsay.11hmwrhqb3a7bmog \
--discovery-token-ca-cert-hash 
sha256:cde88b9ea849b768155b23d9ac73a91c620666b8ae356237ae6b023da2a8eb68
# 查看节点
kubectl get nodes


查看结果

NAME    STATUS   ROLES    AGE     VERSION
node1   Ready    <none>   7m32s   v1.15.0
yun     Ready    master   15m     v1.15.0


查看是否安装成功

kubectl get pods -n kube-system

如果出现类似下面的情况就说明安装完成了,接下来就可以开始k8s之旅了。

NAME                              READY   STATUS              RESTARTS   AGE

coredns-86c58d9df4-mmjls          1/1     Running             0          6h26m

coredns-86c58d9df4-p7brk          1/1     Running             0          6h26m

etcd-promote                      1/1     Running             1          6h26m

kube-apiserver-promote            1/1     Running             1          6h26m

kube-controller-manager-promote   1/1     Running             1          6h25m

kube-proxy-6ml6w                  1/1     Running             1          6h26m

kube-scheduler-promote            1/1     Running             1          6h25m


部署Dashboard UI

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


---Creating sample user

kubectl apply -f dashboard-admin.yaml
serviceaccount/admin-user created
clusterrolebinding.rbac.authorization.k8s.io/admin-user created


---dashboad-admin.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


---获取登录TOKEN

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
Name:         admin-user-token-gxt7q
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: c91be2ce-9bf8-4952-baa0-02502b88514f
Type:  kubernetes.io/service-account-token
Data
====
namespace:  20 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImZLWlBRenZRSkREbjhBU3FOcTJjeEhwbFEzcGFhNGJ5Vlg4RU9uOVVtRG8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWd4dDdxIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJjOTFiZTJjZS05YmY4LTQ5NTItYmFhMC0wMjUwMmI4ODUxNGYiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.HciWSZUhHpwVDjegxYvUsglOId6ooyn83PuyvwTQnnuI8_J_G7bwkC1XDU6WGJim7P1LoL2BtVSVV-Lgl16eZxhKg9LlLsdUwG5g6EUZTBoqbhogBpA7-OVkhehrftRodHun9qRvFSND470DSSfpJEj-5pu35Cw1HeLGwj7FCLaJ_Tuxgx-txhM160N7f59Zmt9Dj_FGLPKFMm-6HN4aUsl-dqigL53jXVgeIsEk3AJtTD9OaWRRRDYqViwGRlRg1pg5gePm_XWSH0RdlIExV0GaO6TLISYGBhKLmnDO9xNEnvHcdeANWlifBD5S4Risy1hi05vx43DHVbHJcx4X1A
ca.crt:     1025 bytes


---

访问http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

输入以上token即可登录;


运行过kubeadm init导致无法通过前置检查,可以运行

kubeadm reset


查看安装情况

kubectl get pods --all-namespaces


如果你想重新启动集群,执行 systemctl start kubelet ,再执行 kubeadm init 或 kubeadm join


https://blog.csdn.net/sinat_35930259/category_7530081.html

https://blog.csdn.net/sinat_35930259/article/details/79944203

https://zhuanlan.zhihu.com/p/148972290

https://blog.csdn.net/qinruan1856/article/details/111060291


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回