kubernetes(k8s)安装部署详情操作流程,基于centos8配置安装部署

山西成润的头像
山西成润
208

首先需要准备3台或者3台以上电脑(虚拟机物理机均可),安装centos8配置ip地址在同一网段;注意:虚拟机需要配置2个cpu,不然会报错

例如:

192.168.3.55 chengrunStorage005
192.168.3.56 chengrunStorage006
192.168.3.57 chengrunStorage007
192.168.3.58 chengrunStorage008

1、各个节点(安装centos8的电脑)配置主机名,为了可以相互找到对方

在192.168.3.55(master--主节点||控制节点)主机上执行下面代码

hostnamectl set-hostname chengrunStorage005

在192.168.3.56(工作节点)主机上执行下面代码

hostnamectl set-hostname chengrunStorage006

在192.168.3.57(工作节点)主机上执行下面代码

hostnamectl set-hostname chengrunStorage007

在192.168.3.58(工作节点)主机上执行下面代码

hostnamectl set-hostname chengrunStorage008

2、配置hosts解析(类似配置域名解析,hosts仅限本机解析)

通过下面命令修改/etc/hosts文件

vi /etc/hosts

增加下面内容

192.168.3.55 chengrunStorage005
192.168.3.56 chengrunStorage006
192.168.3.57 chengrunStorage007
192.168.3.58 chengrunStorage008

3、关闭selinux

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0

4、关闭swap(虚拟内存)

如果不关闭kubernetes运行会出现错误, 即使安装成功了,node重启后也会出现kubernetes server运行错误

暂时关闭,执行下面命令

swapoff -a

永久关闭,需修改/etc/fstab文件

通过下面命令修改/etc/fstab文件

vi /etc/fstab

#/dev/mapper/cl-swap     swap                    swap    defaults        0 0

在/dev/mapper/cl-swap前面加上#注释,上面已经加上注释了

5、配置内核参数,将桥接的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

6、配置centos8阿里云yum源

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

7、安装docker

  1. 配置阿里云yum源
    执行下面命令
    dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  2. 安装containerd.io
    执行下面命令
    dnf install -y https://download.docker.com/linux/centos/8/x86_64/stable/Packages/containerd.io-1.4.8-3.1.el8.x86_64.rpm
  3. 安装docker-ce
    执行下面命令
    dnf install -y docker-ce
  4. 配置docker镜像加速,并且设置docker的cgroupdriver为systemd
    执行下面命令
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json <<EOF
    {
      "registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"],
      "exec-opts": ["native.cgroupdriver=systemd"]
    }
    EOF
  5. 启动docker服务
    systemctl enable --now docker

到目前为止docker已经安装并运行;如果是虚拟机建议进行快照或者备份虚拟机。

8、安装kubernetes(k8s)的kubectl、kubelet、kubeadm

  1. 添加kubernetes源
    阿里源(推荐)
    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=0
    repo_gpgcheck=0
    gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg \
    https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    华为源
    cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://repo.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://repo.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://repo.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
    EOF
    还可以选择其他的源,推荐使用阿里云的kubernetes源
  2. 开始安装
    yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  3. 启用k8s服务
    systemctl enable --now kubelet
    或者
    systemctl enable kubelet
  4. 配置防火墙
    master(主节点||控制节点)
    协议     方向     端口范围     作用     使用者
    TCP     入站     6443     Kubernetes API 服务器     所有组件
    TCP     入站     2379-2380     etcd 服务器客户端 API     kube-apiserver, etcd
    TCP     入站     10250     Kubelet API     kubelet 自身、控制平面组件
    TCP     入站     10251     kube-scheduler     kube-scheduler 自身
    TCP     入站     10252     kube-controller-manager     kube-controller-manager 自身
    master节点通过端口6443、2379-2380、10250、10251、10252
    在主节点或控制节点执行下面命令
    firewall-cmd --add-port=6443/tcp --permanent
    firewall-cmd --add-port=2379/tcp --permanent
    firewall-cmd --add-port=2380/tcp --permanent
    firewall-cmd --add-port=10250/tcp --permanent
    firewall-cmd --add-port=10251/tcp --permanent
    firewall-cmd --add-port=10252/tcp --permanent
    firewall-cmd --add-port=30000/tcp --permanent
    重启防火墙
    firewall-cmd --reload
    查看防火墙(验证上面端口是否全部加入成功)
    firewall-cmd --list-all

    worker节点通过端口10250、30000-32767
    协议     方向     端口范围     作用     使用者
    TCP     入站     10250     Kubelet API     kubelet 自身、控制平面组件
    TCP     入站     30000-32767     NodePort 服务     所有组件
    在工作节点执行下面命令
    firewall-cmd --add-port=10250/tcp --permanent
    firewall-cmd --add-port=30000-32767/tcp --permanent
    重启防火墙
    firewall-cmd --reload
    查看防火墙(验证上面端口是否全部加入成功)
    firewall-cmd --list-all
  5. 下载所需的镜像
    查询需要下载的镜像,执行下面命令
    kubeadm config images list
    使用下面命令查询已下载的镜像
    docker images
    情形1(国内):使用 docker 命令拉取镜像(在国内需要先下载镜像,再给已经下载的镜像打上标签;否则会遇到无法访问k8s.gcr.io的提示)
    注意:对应的版本号要与kubeadm config images list返回列表中镜像版本号一致(执行下面命令)
    例如:k8s.gcr.io/kube-apiserver:v1.22.1 改下docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1;后面v1.22.1就是版本号(发布新版本后会变更)
    docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
    docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
    docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
    docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
    docker pull registry.aliyuncs.com/google_containers/pause:3.5
    docker pull registry.aliyuncs.com/google_containers/etcd:3.5.0-0

    docker pull coredns/coredns:1.8.4

    上面拉取代理仓库中的镜像(会需要一段时间),再打个tag即可 docker tag regsitry.image:tag image:tag
    docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1 k8s.gcr.io/kube-apiserver:v1.22.1
    docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1 k8s.gcr.io/kube-controller-manager:v1.22.1
    docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1 k8s.gcr.io/kube-scheduler:v1.22.1
    docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1 k8s.gcr.io/kube-proxy:v1.22.1
    docker tag registry.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5
    docker tag registry.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0

    docker tag coredns/coredns:1.8.4  k8s.gcr.io/coredns/coredns:v1.8.4
    情形2(国外):如果可以访问k8s.gcr.io(或者在国外),直接执行下面命令
    kubeadm config images pull
    到此镜像就下载完成了,如果是虚拟机建议进行快照或者备份虚拟机。

在各个节点执行上面所有操作,1和8.4中的按照描述在不同的节点执行不同的命令

9、(主节点)初始化k8s集群

执行下面命令

kubeadm init --apiserver-advertise-address=192.168.3.55 --service-cidr=10.10.0.0/16 --pod-network-cidr=10.244.0.0/16

注意:虚拟机需要配置2个cpu,不然会报错

如果执行kubeadm init失败,通过下面命令查看

systemctl status kubelet

如果是这种错误failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\",则通过下面两种办法解决

方法1:执行下面命令修改文件k8s配置

vi /var/lib/kubelet/config.yaml

找到下这个
cgroupDriver: systemd
修改为
cgroupDriver: cgroupfs

方法2:只修改docker配置文件
修改或创建/etc/docker/daemon.json

vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://uyah70su.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker:

systemctl restart docker

通过下面方式查看docker

systemctl status docker
 
docker info

下面是kubelet重启命令

systemctl restart kubelet.service

修改完成后执行下面 进行重置

iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

systemctl stop kubelet

systemctl stop docker

rm -rf /var/lib/cni/*

rm -rf /var/lib/kubelet/*

rm -rf /etc/cni/*

ifconfig cni0 down

ifconfig flannel.1 down

ifconfig docker0 down

ip link delete cni0

ip link delete flannel.1

systemctl start docker

如果执行kubeadm init成功了,需要记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群时执行

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

kubeadm join 192.168.122.21:6443 --token v2r5a4.veazy2xhzetpktfz \
    --discovery-token-ca-cert-hash sha256:daded8514c8350f7c238204979039ff9884d5b595ca950ba8bbce80724fd65d4

如果是非root用户,执行下面

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果是root用户,执行下面

下这个命令每次登录都需要执行

export KUBECONFIG=/etc/kubernetes/admin.conf

可加入到~/.bash_profile文件中,执行下面命令

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

查看节点,pod

kubectl get node

node节点为NotReady,因为corednspod没有启动,缺少网络pod

安装calico或者flannel网络,选择一种即可

安装calico网络

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

安装flannel网络

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

如果yml中的"Network": "10.244.0.0/16"和kubeadm init xxx --pod-network-cidr不一样,就需要修改成一样的。不然可能会使得Node间Cluster IP不通。

如果需要修改,则通过下面方式下载再修改

curl -fsSLO https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

或者

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

修改vi kube-flannel.yml保存后再执行下面命令即可

kubectl apply -f kube-flannel.yml

由于上面的kubeadm init xxx --pod-network-cidr就是10.244.0.0/16。所以此yaml文件就不需要更改了

查看pod和node

kubectl get pod --all-namespaces

10、安装kubernetes-dashboard(k8s网页控制台)

官方部署dashboard的服务没使用nodeport,将yaml文件下载到本地,在service里添加nodeport

curl -fsSLO https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

或者

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

修改配置文件

vi recommended.yaml

下面仅仅列出部分内容

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30000
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort

新增这个type: NodePort、nodePort: 30000就可以

开始安装

kubectl create -f recommended.yaml

已经安装通过下面命令进行删除(如果需要删除)

kubectl delete -f recommended.yaml

如果安装成功,直接访问https://192.168.3.55:30000/

使用 kubectl 命令行工具访问 Dashboard

kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$'

再在浏览器访问下面链接

http://192.168.3.55:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

使用token进行登录,

创建 token,执行下面命令

kubectl create sa dashboard-admin -n kube-system

授权token 访问权限,执行下面命令

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

获取token,执行下面命令

ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')

获取dashboard.kubeconfig 使用token值

DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}')
echo ${DASHBOARD_LOGIN_TOKEN}

执行后输出下面内容(类似下面内容-每次不一样)

eyJhbGciOiJSUzI1NiIsImtpZCI6IjFGeHJFR0hmM1RWcVRUUElLd3FKaVJkZEFuQWlHcmUtOWZRdHUwX3ctYlEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZGQ4bjciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNTFjMjQzZGUtYmUwNi00YjUyLWIzZGMtODdlZTcxOGM2ZjIyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.szwFxJi7LL1YayOYgNo_unSMYXirBnmz8Bvl-1BGAt3Le78rd0sDa3f8vho2mx7lgR46RNZsbk-SyuUxITBq2c0Oov7dvoog6ZfjY5wCR4xC4hmFqQ9Y0tNmcRwHeKZI1ieGepEbctJr2WytlKZgjceyxjoVQJ5j4_1bsR2p9LYdAPuYGkmvGpm-palWuIrWMaO44PGWZcP9aqgKhEWyOaKluvySkxthKVp3OxiXI3UEjnG0kuYTIWrSnhffgjqKjIFz0ndYPUdTo54iUh6tHxfi7pOTsGjBxjrRVG2M09c5kswoCJbOTLsGrLes5LOcAUcQU3dfCt16YgYCEbHvYQ

注意事项:
#kubeadm token 默认时间是24 小时,过期记得从新生成token 然后加入节点
# 查看token

kubeadm   token list

# 创建token

kubeadm   token create

#忘记初始master节点时的node节点加入集群命令怎么办
# 简单方法

kubeadm token create --print-join-command

# 第二种方法

token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0

查看日志

kubectl logs -f --tail -n kube-system

11、worker节点加入集群

加入集群前,先执行部署master节点之前的所有操作

在每个worker节点执行下面命令加入集群(下面命令中的--token、--discovery-token-ca-cert-hash后面的值换成自己的,或者刚刚在主节点生成的命令)

kubeadm join 192.168.3.55:6443 --token 47dyyk.9q900jyt4rpvp7g4 --discovery-token-ca-cert-hash sha256:a234432ca1ce057aad0c0b7466c8503686489591a516fb54fac0723612c1ad4b

如果执行失败需要重置,执行下面命令

kubeadm reset

删除一些文件

rm -rf /etc/cni/net.d
rm -rf $HOME/.kube/config
rm -rf /etc/kubernetes/

#如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建(如果没有记录下来,这个是在master节点执行)

kubeadm token create --print-join-command

到此k8s集群部署完成,感谢您的观看(如有问题,请留言),谢谢。

 

用户评论
评论列表