一、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