K8S从零搭建

一、k8s常用命令

# 查询k8s状态】
sudo  journalctl -f -u kubelet

【#查看集群节点的状态】
kubectl get nodes

【获取clusterrolebinding】
kubectl get clusterrolebinding

【#删除clusterrolebinding】
kubectl delete clusterrolebinding xxxx

【# 获取用户 】
kubectl get serviceaccounts

【#n-指定namespace,否则默认是default下的pod】#-o wide让显示信息更详细,包含所属node、pod的IP等】
kubectl get pods -n [kube-system] -o wide

【#查看已经创建的pod,-A会显示所有namespace下的pods】
kubectl get pods -A -o wide

【#创建命名空间】
kubectl create namespace ***

【# 获取命名空间、命名下的服务、映射端口】
 kubectl get namespace
 kubectl get service -n [namespace]# 创建、删除应用】
 kubectl apply -f xxx.yaml
 kubectl delete -f xxx.yaml

【#在master节点中运行如下命令可以打印出加入该集群的命令(这个命令在要加入的节点上运行)】
kubeadm token create --print-join-command

【#删除集群节点命令】
kubectl delete node k8s-nodename

【#如果集群节点删除后需要再次加入,则需要重置节点信息】
kubeadm reset
【# 重启】
systemctl daemon-reload
systemctl restart kubectl
systemctl restart kubelet

【#获取节点证书certificate-key的命令】
kubeadm init phase upload-certs --upload-certs

【#加入普通节点,直接运行以上打印出的节点加入命令】
kubeadm join k8s-node3:6443 \
--token t5nd9g.d01xp23hdtgko37g \
--discovery-token-ca-cert-hash sha256:25df98ca8636d20b407934e0145a61fff153044xxxx

【#加入控制节点,首先在master节点上获取服务帐户密钥(多两个参数)】
kubeadm join k8s-node3:6443 \
--token t5nd9g.d01xp23hdtgko37g \
--discovery-token-ca-cert-hash sha256:25df98ca8636d20b407934e0145a61fff15304437be517b16bcea6ac754xxxx   \
--control-plane \
--certificate-key  d5d6d1d58d0b3e6d1e3fcdf37b91a09627d7d221cf19c5c0881b9bd1cxxx

【#节点标签操作】
节点打标签 kubectl label nodes <节点名称> labelName=<标签名称>
查看节点标签 kubectl get node --show-labels
删除节点标签 kubectl label node <节点名称> labelName-

二、安装docker(所有节点)

yum install -y docker-ce-1.13.1 docker-ce-cli-1.13.1 containerd.io

yum install -y yum-utils

sudo yum-config-manager \
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

systemctl start docker

三、自定义网络(所有从节点)

docker network create -d bridge test

四、设置主机和从机名称(所有节点)

分别在两台服务器上设置,名称为master的为主节点,node-1为从节点

服务器A:hostnamectl set-hostname master
服务器B:hostnamectl set-hostname node-1

五、 修改所有节点的/etc/hosts 文件:

# 添加
主节点的ip master
从节点的ip node-1

六、在所有节点上安装 Kubernetes

1)配置 YUM 源(所有节点)

添加 k8s 数据源(创建kubernetes.repo)

vi /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
2)安装 Kubernetes 组件(指定版本。kubeadm部署)(所有节点)
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

验证:
kubelet --version
kubeadm version
kubectl version( kubectl -s http://localhost:18080 version)

同步时间(所有节点)

yum install ntpdate

ntpdate ntp1.aliyun.com;hwclock --systohc
3) 在主节点上初始化集群
# 1、关闭 SWAP,重启后失效】
swapoff -a
【# 查看】
free -m

【# 2、初始化】
kubeadm init \
--apiserver-advertise-address=主节点IP \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all

【# 如遇到问题需要重新初始化】
rm -rf /etc/kubernetes/*
kubeadm reset

【# 如果不能重置,使用-f 强制】
rm -rf /etc/kubernetes/*
rm -rf ~/.kube/*
rm -rf /var/lib/etcd/*
rm -rf /var/lib/cni/
rm -fr /etc/cni/net.d

重新使用kubeadm init初始化即可

【# 出现以下则成功:】
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join IP:6443 --token bmnvtr.wi54ax3rtbuxtpm6 \
        --discovery-token-ca-cert-hash sha256:fee355e8057ea593d3d0ca39a66ca909cdadebd77d337a040cbb70fed8a143c1

【# 若报错查看k8s状态】
sudo  journalctl -f -u kubelet

(Nov 16 01:56:05 k8s-master kubelet[8634]: E1116 01:56:05.490013    8634 server.go:302] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\"")

从 log 可以看出是驱动问题,即 docker 的驱动与 kubelet 驱动不一致。

【# 查看 docker 驱动:】
$ docker info | grep Cgroup
   Cgroup Driver: cgroupfs

【# 查看 kubelet 驱动:】
$ sudo cat /var/lib/kubelet/config.yaml | grep cgroup
   cgroupDriver: systemd

修改 docker 驱动,查看 /etc/docker/daemon.json 文件(如果没有,手动创建),添加以下内容:
{
 "exec-opts":["native.cgroupdriver=systemd"]
}# 重启 docker 和 重置 Master 节点:】
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo kubeadm reset

【# 初始化参数说明:】
--apiserver-advertise-address:设置 Master 节点 API Server 的监听地址
--image-repository:设置容器镜像拉取地址;
--kubernetes-version:设置 K8S 版本,需与您安装的保持一致;
--service-cidr:集群内部虚拟网络,Pod 统一访问入口;
--pod-network-cidr:Pod 网络,与部署 CNI 网络组件 yaml 文件中需保持一致;
--ignore-preflight-errors:其错误将显示为警告的检查列表,值为 'all' 忽略所有检查中的错误;
4) 创建 kubectl 连接认证文件 (主节点)
mkdir -p $HOME/.kube

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

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

export KUBECONFIG=/etc/kubernetes/admin.conf

注意:如果后面重启等原因遇到如下报错,重新执行上面四个命令即可:

Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
5) 启动k8s(主节点)
systemctl start kubelet
6) 添加 Flannel 网络插件(主节点)
# 添加插件】
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

【# 重启网络】
sudo systemctl restart network

【# 重启k8s】
sudo systemctl restart kubelet

【# 查看状态,看到STATUS 为Ready 则成功】
kubectl get pods

NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   33m   v1.23.0

七、Node 节点加入集群

1)创建 kubectl 连接认证文件
从 主节点上复制 /etc/kubernetes/admin.conf 文件到本地 /etc/kubernetes/admin.conf

sudo chmod +r /etc/kubernetes/admin.conf

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

source ~/.bash_profile
2)把 Node 主机加入集群
# 关闭 SWAP,重启后失效】
swapoff -a
【# 查看】
free -m

【# 主节点初始化时结尾输出参数】
命令(主节点):kubeadm token create --print-join-command

执行从节点:
kubeadm join ip:6443 --token bch9fu.66iyhqoqhes3pjzl \
        --discovery-token-ca-cert-hash sha256:d1fbf6eebfe23e5038282007ebf866c2dfaf3978eda2daf35fe8cf852a5cxxxx

【# 若报错则参考主节点初始化失败解决办法】
重置状态:kubeadm reset
注意:重置状态后,需重新执行admin.conf复制以及权限赋予
3)添加网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

重启网络
sudo systemctl restart network
sudo systemctl restart kubelet

kubectl get nodes

八、卸载 Kubernetes (Master/Node 上)

1)Flannel 插件清理
cd /home/k8s

kubectl delete -f kube-flannel.yml

sudo systemctl restart kubelet
2)重置节点
sudo kubeadm reset

[reset] Reading configuration from the cluster...
[reset] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
...
3)卸载组件

卸载 3 个 k8s 重要组件
sudo yum -y remove kubelet kubeadm kubectl

Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package kubeadm.x86_64 0:1.23.0-0 will be erased
---> Package kubectl.x86_64 0:1.23.0-0 will be erased
---> Package kubelet.x86_64 0:1.23.0-0 will be erased
--> Processing Dependency: kubelet for package: kubernetes-cni-0.8.7-0.x86_64
--> Running transaction check
---> Package kubernetes-cni.x86_64 0:0.8.7-0 will be erased
--> Finished Dependency Resolution
...

删除配置目录
rm -rf ~/.kube/

4)清理 k8s 相关的 docker 镜像

单独安装的 k8s 可以运行如下命令,清理全部 k8s 镜像:

docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

也可以根据 docker images 命令的输出列表,手动运行 docker rmi 命令逐个删除 k8s 的镜像:

sudo docker images
sudo docker rmi [IMAGE ID]

重启 docker

sudo systemctl daemon-reload
sudo systemctl restart docker

九、搭建dashbord

1)主节点创建k8s文件夹
2)下载与自己k8s版本对应的recommended.yaml到本地k8s目录

官网地址:https://github.com/kubernetes/dashboard/releases

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

下载后修改:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

registry.aliyuncs.com/google_containers

3)执行安装命令:
kubectl apply -f recommended.yaml

在这里插入图片描述

检查命令:

kubectl get pods -A -o wide

在这里插入图片描述

4)发现运行在master节点

访问 https://ip:30001

注意:1、https访问;2、30001端口是recommended.yaml配置的

5)如发现谷歌浏览器无法访问(证书不安全),火狐浏览器可以访问,先用狐火访问

在这里插入图片描述

kubectl get secret -n kubernetes-dashboard|grep  kubernetes-dashboard-token
# 根据上条命令输入对应的secret,方式如下图
kubectl describe secret 【kubernetes-dashboard-token-xq9pc】 -n kubernetes-dashboard

在这里插入图片描述
在这里插入图片描述

6)发现访问后没有数据,创建一个有权限的账号

创建 dashboard-adminuser.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 dashboard-adminuser.yaml

查看

kubectl get serviceaccounts -n kubernetes-dashboard
NAME                   SECRETS   AGE
admin-user             1         15m
default                1         32m
kubernetes-dashboard   1         32m

获取账号token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
7)账号密码方式访问
1)在装过dashboard环境下

我们去master节点新增一个文件,如果有多个master,那么每个master同下操作。
里面内容结构是:用户名,密码(用户名和密码要保持一致),唯一ID。

echo "admin,admin,1" > /etc/kubernetes/pki/basic_auth_file
2)修改配置kube-apiserver.yaml文件
vi /etc/kubernetes/manifests/kube-apiserver.yaml

新加入一行位置:
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-cluster-ip-range=10.1.0.0/16
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
- --basic-auth-file=/etc/kubernetes/pki/basic_auth_file  # 只有这一行是新增的,用来指定basic_auth_file位置
3)创建集群角色权限绑定
kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin
4)检查集群角色权限绑定
kubectl get clusterrolebinding login-on-dashboard-with-cluster-admin
5)修改 recommended.yaml 配置文件

在 kind: Deployment 下位置新增两行

args:
    - --auto-generate-certificates
    - --namespace=kubernetes-dashboard
    - --token-ttl=21600 #新增行 单位秒
    - --authentication-mode=basic #新增行
6)重启dashbord
kubectl apply -f recommended.yaml

在这里插入图片描述

报错:

replicationcontrollers is forbidden: User "system:anonymous" cannot list resource "replicationcontrollers" in API group "" in the namespace "default"

解决:

#创建test:anonymous】
kubectl create clusterrolebinding cluster-system-anonymons --clusterrole=cluster-admin --user=system:anonymous

【获取clusterrolebinding】
kubectl get clusterrolebinding
8)解决谷歌浏览器不能访问情况
1)在k8s目录下创建一个用于自签证书的目录
mkdir kubernetes-dashboard-key && cd kubernetes-dashboard-key
2)生成证书请求的key
openssl genrsa -out dashboard.key 2048
3)ip为master节点的IP地址
openssl req -new -out dashboard.csr -key dashboard.key -subj '/CN=ip'
4)生成自签证书
openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
5)删除原有证书
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
6)创建新证书的secret
kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
7)查找正在运行的pod
kubectl get pod -n kubernetes-dashboard
8)删除pod(根据实际情况输入podname),让k8s自动拉起一个新的pod,相对于重启
kubectl delete pod kubernetes-dashboard-7d6c598b5f-fvcg8 -n kubernetes-dashboard

重新部署dashborad,如果谷歌证书失效则重新执行以5-8

十、docker容器迁入k8s

1)kompose
#创建文件夹:】
/xxx/kompose

【#下载kompose:】
curl -L https://github.com/kubernetes/kompose/releases/download/v1.28.0/kompose-linux-amd64 -o kompose

【#赋权】
chmod +x kompose

【#将docker run 命令在下网址转换为docker-compose,
并创建docker-compose.yaml,
将docker-compose文件复制在docker-compose.yaml】
https://www.composerize.com/

【#执行命令,创建deployment等文件,grafana为例:】
 ./kompose convert -f docker-compose.yaml
 ./kompose convert -f docker-compose.yaml --volumes hostPath

在这里插入图片描述

2)修改配置文件
创建命名空间:
kubectl create namespace operation

修改service文件

apiVersion: v1
kind: Service
metadata:
  annotations:
    kompose.cmd: ./kompose convert -f docker-compose.yaml
    kompose.version: 1.28.0 (c4137012e)
  creationTimestamp: null
  labels:
    io.kompose.service: grafana
  name: grafana
  namespace: operation #=== 添加命名空间
spec:
  type: NodePort # ====== 添加访问方式
  ports:
    - name: "3000"
      port: 3000
      targetPort: 3000
      nodePort: 30005 # ====== 添加访问端口
      protocol: TCP # ====== 添加访问方式
  selector:
    io.kompose.service: grafana
status:
  loadBalancer: {}

修改deployment文件

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: ./kompose convert -f docker-compose.yaml --volumes hostPath
    kompose.version: 1.28.0 (c4137012e)
  creationTimestamp: null
  labels:
    io.kompose.service: grafana
  name: grafana
  namespace: operation #=== 添加命名空间
spec:
... ...
... ...
3)启动命令
kubectl apply -f /xxx/kompose/grafana-deployment.yaml,/xxx/kompose/grafana-service.yaml
4)访问

此时端口为nodePort配置的对外暴露端口
http://ip:30005

5)服务器修改:

主、从:

【开放端口】(--permanent永久生效,没有此参数重启后失效)
sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=53/tcp --permanent
sudo firewall-cmd --add-port=53/udp --permanent
sudo firewall-cmd --add-port=9153/tcp --permanent
【重新加载生效】
sudo firewall-cmd --reload
【查询列表】
sudo firewall-cmd --list-all
【删除】
sudo firewall-cmd --zone=public --remove-port=53/tcp --permanent
6)错误解决
【01】
... ...
read udp 10.244.1.162:45971->10.96.0.10:53: i/o timeout

(解决办法)
查询本机域名解析地址:
(1)cat /etc/resolv.conf
(2)修改deployment.yaml文件,添加如下代码

      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 192.168.99.100 # 第一步查询的地址
        searches:
          - oapi.dingtalk.com # 对应的域名地址
        options:
          - name: ndots
            value: "2"
          - name: edns0
【02】
... ...
xxxx:45642->xxxx:53: read: no route to host

(解决办法)
降低kube-proxy版本:
kubectl -n kube-system set image daemonset/kube-proxy *=registry.aliyuncs.com/k8sxio/kube-proxy:v1.17.6
【03】
... ...
"Failed to get system container stats" err="failed to get cgroup stats for \"/system.slice/kubelet.service\": failed to get container info for \"/system.slice/kubelet.service\": unknown container \"/system.slice/kubelet.service\"" containerName="/system.slice/kubelet.service"
... ...

(解决办法)
vim /etc/sysconfig/kubelet

添加:--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice

KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"

systemctl daemon-reload
systemctl restart kubelet
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值