- kubeadm介绍
- kubeadm是一个工具,提供了kubeadm init以及kubeadn join这两个命令来快速创建kubernetes集群
- kubeadm会将k8s的核心组件部署为Pod。kubelet和docker为系统守护进程模式,且运行为静态static Pod。
- 守护进程模式组件
- kubelet
- kubeadm
- kubectl
- docker-ce
- 容器启动模式组件
- kube-apiserver
- kube-proxy
- kube-controller-manager
- kube-scheduler
- etcd
- coredns
- kube-flannel
- 安装环境
- 10.0.31.181 master.larryyu.com
- 10.0.31.182 node1.larryyu.com
- 10.0.31.183 node2.larryyu.com
- 前提
- 基于主机名通信
- 时间同步
- 关闭firewalld和iptables.service
安装配置步骤
yum环境配置(所有节点)
增加docker-ce repo配置
$ wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
增加kubernetes repo配置
$ vim kubernetes.repo[kubernetes]name=Kubernetes Repobaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg# 注,阿里云的kubenetes yum源如果开启pgpcheck需要导入pgpkey$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg$ wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg$ rpm --import yum-key.gpg$ rpm --import rpm-package-key.gpg
安装守护进程组件
$ yum -y install kubelet kubeadm kubectl docker-ce修改仓库代理
- Kubeadm在安装时会从docker仓库下载镜像,但在国内可能无法下载,可修改docker启动配置文件增加代理
$ vim /usr/lib/systemd/system/docker.service Environment="HTTPS_PROXY=http://www.ik8s.io:10080"
- Kubeadm在安装时会从docker仓库下载镜像,但在国内可能无法下载,可修改docker启动配置文件增加代理
启动docker服务
$ systemctl daemon-reload $ systemctl restart docker $ docker info ... HTTPS Proxy: http://www.ik8s.io:10080 # 代理地址 Registry: https://index.docker.io/v1/ ...设置开机启动
$ systemctl enable kubelet $ systemctl enable docker打开内置桥接功能
- k8s在运行中会生成很多iptables或者ipvs规则,建议打开系统内置的桥接功能,否者会在kubeadm init时报错。
$ echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables $ echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
- k8s在运行中会生成很多iptables或者ipvs规则,建议打开系统内置的桥接功能,否者会在kubeadm init时报错。
master节点安装
- 初始化kubernetes命令介绍
$ kubeadm init --help --apiserver-advertise-address string # apiserver监听地址 --apiserver-bind-port int32 # 要绑定到的API服务器的端口。(默认值6443) --cert-dir string # 保存和存储证书的路径 --certificate-key string # 用于加密证书的密钥 --config string # kubeadm配置文件的路径 --dry-run --ignore-preflight-errors strings # 忽略错误检查,例如:“IsPrivilegedUser,Swap” --kubernetes-version string # 指定Kubernetes版本 --node-name string # 指定node节点名称 --pod-network-cidr string # 指定pod网络的IP地址范围。 --service-cidr string # 为service设置IP地址范围。(默认为“10.96.0.0/12”)
- 初始化kubernetes命令介绍
初始化工作流程
- 在初始化之前,进行系统状态检查,如果遇到错误,会直接退出初始化,知道问题解决或者用户使用—ignore-preflight-errors=
- 生成自签名证书,为集群中每个组件配置CA证书或者秘钥
- 写入kubeconfig文件/etc/kubernetes/以供kubelet控制器管理器和调度程序用于连接到API服务器,以及一个名为的用于管理的附加kubeconfig文件admin.conf。
- 为API服务器,控制器管理器和调度程序生成静态Pod清单。如果未提供外部etcd,则会为etcd生成一个附加的静态Pod清单。
- 初始化Kubernetes主节点
```bash
初始化节点
$ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12ERROR—-k8s默认不允许开启swap,否者在初始化时会报错退出
… [ERROR Swap]: running with swap on is not supported. Please disable swap …解决—-忽略swap错误
$ vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS=”—fail-swap-on=false”
再次初始化
$ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12 —ignore-preflight-errors=Swap
ERROR—-最近代理www.ik8s.io:10080也无法使用了,只能先下载了
… [ERROR ImagePull]: failed to pull image k8s.gcr.io/coredns:1.6.2: output: Error response from daemon: Get https://k8s.gcr.io/v2/: proxyconnect tcp: dial tcp 172.96.236.117:10080: connect: connection refused …
解决—-指定使用阿里云仓库下载
1、删除前面添加的代理配置Environment=”HTTPS_PROXY=http://www.ik8s.io:10080“ 2、在init命令中添加—image-repository registry.aliyuncs.com/google_containers参数 $ kubeadm init —kubernetes-version=stable-v1 —pod-network-cidr=10.244.0.0/16 —service-cidr=10.96.0.0/12 —image-repository registry.aliyuncs.com/google_containers —ignore-preflight-errors=Swap …
安装成功会有如下提示
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster. Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
安装完成后会生成一条加入集群命令,建议保存起来
kubeadm join 10.0.31.181:6443 —token 4r3cpc.j1llf4lpsen8s1xb \ —discovery-token-ca-cert-hash sha256:819a5e9c2a567f50d80e6dfb5c8978a24323a150397ccffae3a4884b204e0b89 …
根据提示执行命令
$ mkdir -p $HOME/.kube $ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
下载完成后可以查看下载的image
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-proxy v1.16.2 8454cbe08dc9 3 weeks ago 86.1MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.16.2 6e4bffa46d70 3 weeks ago 163MB registry.aliyuncs.com/google_containers/kube-scheduler v1.16.2 ebac1ae204a2 3 weeks ago 87.3MB registry.aliyuncs.com/google_containers/kube-apiserver v1.16.2 c2c9a0406787 3 weeks ago 217MB registry.aliyuncs.com/google_containers/etcd 3.3.15-0 b2756210eeab 2 months ago 247MB registry.aliyuncs.com/google_containers/coredns 1.6.2 bf261d157914 3 months ago 44.1MB registry.aliyuncs.com/google_containers/pause 3.1 da86e6ba6ca1 23 months ago 742kB
- 初始化完成后可使用kubectl命令查看集群状态
```bash
# kubectl常用的get命令
kubectl cluster-info # 查看集群状态信息
kubectl get cs -o yaml # 查看集群状态
kubectl get nodes # 查看集群节点信息
kubectl get ns # 查看集群命名空间
kubectl get svc -n kube-system # 查看指定命名空间的服务
kubectl get pod <pod-name> -o wide # 查看Pod详细信息
kubectl get pod <pod-name> -o yaml # 以yaml格式查看Pod详细信息
kubectl get pods -n kube-system # 查看资源对象,查看所有Pod列表
kubectl get rc,service # 查看资源对象,查看rc和service列表
kubectl get pod,svc,ep --show-labels # 查看pod,svc,ep能及标签信息
kubectl get all --all-namespaces # 查看所有的命名空间
kubectl describe nodes <node-name> # 显示Node的详细信息
kubectl describe pods/<pod-name> # 显示Pod的详细信息
在初始化完成后使用kubectl get nodes查看节点信息
可以看到master的STATUS为NotReady状态,这是因为集群没有网络组件,需单独下载安装网络组件$ kubectl get nodes NAME STATUS ROLES AGE VERSION master.larryyu.com NotReady master 23m v1.16.2 # 此处使用flannel来作为网络组件 $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 查看pod创建情况,需要使用-n指定名称空间 $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-58cc8c89f4-5zp4b 1/1 Running 0 29m coredns-58cc8c89f4-lmzmz 1/1 Running 0 29m etcd-master.larryyu.com 1/1 Running 0 28m kube-apiserver-master.larryyu.com 1/1 Running 0 28m kube-controller-manager-master.larryyu.com 1/1 Running 0 29m kube-flannel-ds-amd64-dt768 1/1 Running 0 2m41s kube-proxy-77vcj 1/1 Running 0 29m kube-scheduler-master.larryyu.com 1/1 Running 0 28m # 再次查看节点状态 $ kubectl get nodes NAME STATUS ROLES AGE VERSION master.larryyu.com Ready master 30m v1.16.2将node节点加入到集群中
将之前初始化master时保存的命令在node节点上执行$ kubeadm join 10.0.31.181:6443 --token 4r3cpc.j1llf4lpsen8s1xb --discovery-token-ca-cert-hash sha256:819a5e9c2a567f50d80e6dfb5c8978a24323a150397ccffae3a4884b204e0b89 --ignore-preflight-errors=Swap # 完成后可以查看节点状态 $ kubectl get nodes NAME STATUS ROLES AGE VERSION master.larryyu.com Ready master 42m v1.16.2 node1.larryyu.com Ready <none> 108s v1.16.2 node2.larryyu.com NotReady <none> 64s v1.16.2 # 在刚刚加入节点时,node的状态为NotReady,这是因为加入集群后,k8s会为node节点安装flannel组件,在flannel组件安装完成后,集群创建完成 # 查看kube-system名称空间pod信息 kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP coredns-58cc8c89f4-5zp4b 1/1 Running 0 47m 10.244.0.3 coredns-58cc8c89f4-lmzmz 1/1 Running 0 47m 10.244.0.2 etcd-master.larryyu.com 1/1 Running 0 46m 10.0.31.181 kube-apiserver-master.larryyu.com 1/1 Running 0 46m 10.0.31.181 kube-controller-manager-master.larryyu.com 1/1 Running 0 46m 10.0.31.181 kube-flannel-ds-amd64-47drt 1/1 Running 0 6m22s 10.0.31.183 kube-flannel-ds-amd64-dt768 1/1 Running 0 19m 10.0.31.181 kube-flannel-ds-amd64-hs498 1/1 Running 0 7m6s 10.0.31.182 kube-proxy-2zjvg 1/1 Running 0 7m6s 10.0.31.182 kube-proxy-77vcj 1/1 Running 0 47m 10.0.31.181 kube-proxy-qqb2l 1/1 Running 0 6m22s 10.0.31.183 kube-scheduler-master.larryyu.com 1/1 Running 0 45m 10.0.31.181 # 可以看到在node1和node2上也启动了flannel和kube-proxy组件
