修改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: REDACTEDkubectl 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