2-2、kubernetes安装
kubernetes安装: master,etcd: node: 前提:基于主机名通信; 时间同步; 关闭firewalld和iptables.service OS:centos7.3,extra 步骤: etcd cluster,仅master节点; flannel,集群的所有节点; 配置k8s的master:仅master节点:kubernetes-master 启动的服务:kube-apiserver,kube-scheduler,kube-controller-manager 配置的K8s的node节点:kubernetes-node 先设定启动docker服务; 启动的k8s服务:kube-proxy,kubelet kubeadm: 1、master,nodes安装kubelet,kubeadm,docker 2、master:kubeadm init 3、nodes:kubeadm join https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md 关闭firewalld,selinux 1、配置yum源: docker yum源: wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云yum源: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache #docker yum源 cat >> /etc/yum.repos.d/docker.repo <<EOF [docker-repo] name=Docker Repository baseurl=http://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7 enabled=1 gpgcheck=0 EOF kubernertes yum源: cat >> /etc/yum.repos.d/k8s.repo <<EOF [k8s] name=k8s baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 enabled=1 EOF gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg enabled=1 若要使用key: # wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg # yum --import yum-key.gpg 其它yum源: wget http://mirrors.aliyun.com/repo/Centos-7.repo 2、master端操作: # yum install -y docker-ce kubelet kubeadm kubectl # rpm -ql docker-ce /usr/bin/docker-init /usr/bin/docker-proxy /usr/bin/dockerd-ce /usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.socket /var/lib/docker-engine/distribution_based_engine-ce.json # rpm -ql kubelet /etc/kubernetes/manifests /etc/sysconfig/kubelet /usr/bin/kubelet /usr/lib/systemd/system/kubelet.service # rpm -ql kubeadm /usr/bin/kubeadm /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf # rpm -ql kubectl /usr/bin/kubectl # vi /usr/lib/systemd/system/docker.service Environment="HTTPS_PROXY=http://www.ik8s.io:10080 Environment=""NO_PROXY=127.0.0.0.8,192.168.31.0/16" # systemctl daemon-reload # systemctl start docker.service # cat /proc/sys/net/bridge/bridge-nf-call-iptables 1 # systemctl enable docker.service # systemctl enable kubelet # ss -tnl # vi /etc/sysconfig/kubelet #禁用swap KUBELET_EXTRA_ARGS="--fail-swap-on=false" # kubeadm init --help # kubeadm init --kubernetes-version=stable-1.11 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap # kubeadm init --kubernetes-version=stable-1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --kubernetes-version=stable-1.11 #指定kubernetes版本 --pod-network-cidr=10.244.0.0/16 #指定pod的网段 --service-cidr=10.96.0.0/12 #指定service的网段 --ignore-preflight-errors=Swap #忽略swap 初始化失败,国内网站无法访问dl.k8s.io/,因此需要事先把这些镜像拉取下来: could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://dl.k8s.io/release/stable-1.txt: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 方法1:有个墙外的代理服务器,对docker配置代理,需修改/etc/sysconfig/docker文件,添加: HTTP_PROXY=http://proxy_ip:port http_proxy=$HTTP_PROXY 重启docker:systemctl restart docker # docker image ls # kubeadm config images pull # kubeadm config images list #初始化时需要的镜像 k8s.gcr.io/kube-apiserver:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0 k8s.gcr.io/pause:3.1 k8s.gcr.io/etcd:3.3.10 k8s.gcr.io/coredns:1.3.1 方法2:通过 docker.io/mirrorgooglecontainers中转一下https://hub.docker.com/u/mirrorgooglecontainers # kubeadm config images list |sed -e 's/^/docker pull /g' -e 's#k8s.gcr.io#docker.io/mirrorgooglecontainers#g' |sh -x #下载需要的镜像 # docker images |grep mirrorgooglecontainers |awk '{print "docker tag ",$1":"$2,$1":"$2}' |sed -e 's#mirrorgooglecontainers#k8s.gcr.io#2' |sh -x #重命名镜像 # docker images |grep mirrorgooglecontainers |awk '{print "docker rmi ", $1":"$2}' |sh -x #删除mirrorgooglecontainers镜像 # docker pull docker.io/mirrorgooglecontainers/kube-apiserver:v1.14.0 # docker pull docker.io/mirrorgooglecontainers/kube-controller-manager:v1.14.0 # docker pull docker.io/mirrorgooglecontainers/kube-scheduler:v1.14.0 # docker pull docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0 # docker pull docker.io/mirrorgooglecontainers/pause:3.1 # docker pull docker.io/mirrorgooglecontainers/etcd:3.3.10 # docker tag mirrorgooglecontainers/kube-apiserver:v1.14.0 k8s.gcr.io/kube-apiserver:v1.14.0 # docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0 # docker tag mirrorgooglecontainers/kube-controller-manager:v1.14.0 k8s.gcr.io/kube-controller-manager:v1.14.0 # docker tag mirrorgooglecontainers/kube-scheduler:v1.14.0 k8s.gcr.io/kube-scheduler:v1.14.0 # docker tag mirrorgooglecontainers/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10 # docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 coredns没包含在docker.io/mirrorgooglecontainers中,需要手工从coredns官方镜像转换下。 # docker pull coredns/coredns:1.3.1 # docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 # docker rmi coredns/coredns:1.3.1 master初始化: # kubeadm init --kubernetes-version=stable-1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap # kubectl get -h # kubectl get cs #kubectl get componentstatus NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"} 或: # kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU 因为后面要安装网络插件flannel ,所有这里要添加参数, --pod-network-cidr=10.244.0.0/16,10.244.0.0/16是flannel插件固定使用的ip段,它的值取决于你准备安装哪个网络插件 如果要自定义配置,先kubeadm config print init-defaults >kubeadm.conf,再修改,改完指定配置文件路径--config /root/kubeadm.conf 指定Kubenetes版本--kubernetes-version,如果不指定该参数,会从google网站下载最新的版本信息,因为它的默认值是stable-1。 因为使用的是虚拟机,只分配一个cpu,所以指定了参数--ignore-preflight-errors=NumCPU,如果你的cpu足够,不要添加这个参数. 初始化参数说明: -apiserver-advertise-address string API Server将要广播的监听地址。如指定为 `0.0.0.0` 将使用缺省的网卡地址。 --apiserver-bind-port int32 缺省值: 6443 API Server绑定的端口 --apiserver-cert-extra-sans stringSlice 可选的额外提供的证书主题别名(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。 --cert-dir string 缺省值: "/etc/kubernetes/pki" 证书的存储路径。 --config string kubeadm配置文件的路径。警告:配置文件的功能是实验性的。 --cri-socket string 缺省值: "/var/run/dockershim.sock" 指明要连接的CRI socket文件 --dry-run 不会应用任何改变;只会输出将要执行的操作。 --feature-gates string 键值对的集合,用来控制各种功能的开关。可选项有: Auditing=true|false (当前为ALPHA状态 - 缺省值=false) CoreDNS=true|false (缺省值=true) -h, --help 获取init命令的帮助信息 --ignore-preflight-errors stringSlice 忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。 --kubernetes-version string 缺省值: "stable-1" 为control plane选择一个特定的Kubernetes版本。 --node-name string 指定节点的名称。 --pod-network-cidr string 指明pod网络可以使用的IP地址段。 如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。 --service-cidr string 缺省值: "10.96.0.0/12" 为service的虚拟IP地址另外指定IP地址段 --service-dns-domain string 缺省值: "cluster.local" 为services另外指定域名, 例如: "myorg.internal". --skip-token-print 不打印出由 `kubeadm init` 命令生成的默认令牌。 --token string 这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例: abcdef.0123456789abcdef --token-ttl duration 缺省值: 24h0m0s 令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。 ----------------------- 部署pod网络插件:flannel插件 选择flannel作为网络插件: vim /etc/sysctl.conf,添加以下内容 net.ipv4.ip_forward=1 net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 修改后,及时生效 sysctl -p 地址:https://github.com/coreos/flannel # kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml flannel 默认会使用主机的第一张网卡,如果你有多张网卡,需要通过配置单独指定。修改 kube-flannel.yml 中的以下部分 vim kube-flannel.yml containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.10.0-amd64 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=ens33 #添加 # kubectl apply -f kube-flannel.yml 查看各组件的状态: # kubectl get cs # kubectl get componentstatus # kubectl get nodes NAME STATUS ROLES AGE VERSION vm1.cluster.com Ready master 13m v1.14.0 # kubectl get pod No resources found. # kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-fb8b8dccf-4sr5b 1/1 Running 0 14m coredns-fb8b8dccf-rmj7h 1/1 Running 0 14m etcd-vm1.cluster.com 1/1 Running 0 13m kube-apiserver-vm1.cluster.com 1/1 Running 0 13m kube-controller-manager-vm1.cluster.com 1/1 Running 0 13m kube-flannel-ds-amd64-rnght 1/1 Running 0 2m30s kube-proxy-mxjwr 1/1 Running 0 14m kube-scheduler-vm1.cluster.com 1/1 Running 0 13m # kubectl get ns #名称空间 NAME STATUS AGE default Active 16m kube-node-lease Active 16m kube-public Active 16m kube-system Active 16m 3、在node节点上操作: # yum install -y docker-ce kubelet kubeadm # vi /usr/lib/systemd/system/docker.service Environment="HTTPS_PROXY=http://www.ik8s.io:10080 Environment=""NO_PROXY=127.0.0.0.8,192.168.31.0/16" # vi /etc/sysconfig/kubelet #禁用swap KUBELET_EXTRA_ARGS="--fail-swap-on=false" # systemctl start docker # systemctl enable docker # systemctl enable kubelet 注意,这里不需要启动kubelet,初始化的过程中会自动启动的,如果此时启动了会出现如下报错,忽略即可。日志在tail -f /var/log/messages failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file “/var/lib/kubelet/config.yaml”, error: open /var/lib/kubelet/config.yaml: no such file or directory kubeadm join 192.168.31.11:6443 --token rquyna.2jykkhlqq7zr306v \ --discovery-token-ca-cert-hash sha256:f7d07c0ba9ce136a0fb5d3a623146c51e17dfe49d69273474dc4ac902415dc79 --ignore-preflight-errors=Swap node节点所需要的几个镜像: k8s.gcr.io/kube-proxy-amd64:v1.10.0 k8s.gcr.io/pause-amd64:3.1 quay.io/coreos/flannel:v0.9.1-amd64(为网络插件的镜像,这里选择flannel为网络插件) # docker pull docker.io/mirrorgooglecontainers/kube-proxy:v1.14.0 # docker pull docker.io/mirrorgooglecontainers/pause:3.1 # docker tag mirrorgooglecontainers/kube-proxy:v1.14.0 k8s.gcr.io/kube-proxy:v1.14.0 # docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1 # docker pull coredns/coredns:1.3.1 # docker tag coredns/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1 # docker rmi coredns/coredns:1.3.1 node节点上会拉取如下镜像: # docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.14.0 5cd54e388aba 10 days ago 82.1MB k8s.gcr.io/kube-scheduler v1.14.0 00638a24688b 10 days ago 81.6MB k8s.gcr.io/kube-apiserver v1.14.0 ecf910f40d6e 10 days ago 210MB k8s.gcr.io/kube-controller-manager v1.14.0 b95b1efa0436 10 days ago 158MB quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 2 months ago 52.6MB coredns/coredns 1.3.1 eb516548c180 2 months ago 40.3MB k8s.gcr.io/coredns 1.3.1 eb516548c180 2 months ago 40.3MB k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 4 months ago 258MB k8s.gcr.io/pause 3.1 da86e6ba6ca1 15 months ago 742kB 在master上查看: # kubectl get nodes NAME STATUS ROLES AGE VERSION vm1.cluster.com Ready master 36m v1.14.0 vm2.cluster.com NotReady <none> 4m36s v1.14.0 如要剔除node节点: # kubectl delete node vm2.cluster.com # kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-fb8b8dccf-4sr5b 1/1 Running 0 36m coredns-fb8b8dccf-rmj7h 1/1 Running 0 36m etcd-vm1.cluster.com 1/1 Running 0 35m kube-apiserver-vm1.cluster.com 1/1 Running 0 35m kube-controller-manager-vm1.cluster.com 1/1 Running 0 35m kube-flannel-ds-amd64-rnght 1/1 Running 0 24m kube-flannel-ds-amd64-sng8b 0/1 Init:0/1 0 4m42s kube-proxy-hptk5 0/1 ContainerCreating 0 4m42s kube-proxy-mxjwr 1/1 Running 0 36m kube-scheduler-vm1.cluster.com 1/1 Running 0 35m # kubectl get pods -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-fb8b8dccf-4sr5b 1/1 Running 0 36m 10.244.0.3 vm1.cluster.com <none> <none> coredns-fb8b8dccf-rmj7h 1/1 Running 0 36m 10.244.0.2 vm1.cluster.com <none> <none> etcd-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none> kube-apiserver-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none> kube-controller-manager-vm1.cluster.com 1/1 Running 0 35m 192.168.31.11 vm1.cluster.com <none> <none> kube-flannel-ds-amd64-rnght 1/1 Running 0 25m 192.168.31.11 vm1.cluster.com <none> <none> kube-flannel-ds-amd64-sng8b 0/1 Init:0/1 0 4m55s 192.168.31.22 vm2.cluster.com <none> <none> kube-proxy-hptk5 0/1 ContainerCreating 0 4m55s 192.168.31.22 vm2.cluster.com <none> <none> kube-proxy-mxjwr 1/1 Running 0 36m 192.168.31.11 vm1.cluster.com <none> <none> kube-scheduler-vm1.cluster.com 1/1 Running 0 36m 192.168.31.11 vm1.cluster.com <none> <none> pod,service,replicaset,deployment,statefulet,daemonset,job,cronjob,node deployment,job:pod的控制器 # kubectl version # kubectl cluster-info Kubernetes master is running at https://192.168.31.11:6443 KubeDNS is running at https://192.168.31.11:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy # kubectl run nginx-deploy --image=nginx:1.14-alpine --port=8080 --replicas=1 --generator=run-pod/v1 kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead. deployment.apps/nginx-deploy created (dry run) # kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 0/1 1 0 69s # kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--external-ip=external-ip-of-service] [--type=type] [options] # kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h50m nginx ClusterIP 10.108.178.106 <none> 80/TCP 9s # curl 10.108.178.106 # kubectl describe service nginx # kubectl edit svc nginx #编辑这个service # kubectl scaled --replicas=3 deployment nginx #扩容到3个pod # kubectl describe pods nginx # kubectl set image deployment nginx nginx=nginx:1.15-alpine #更新镜像版本 # kubectl rollout status deployment nginx #查看更新过程,灰度 # kubectl rollout undo deployment nginx #回滚,默认是回滚到上一个版本 在外部访问,需要修改pod的类型 # kubectl edit svc nginx spec: clusterIP: 10.108.178.106 ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx-deploy sessionAffinity: None type: ClusterIP --->修改问NodePort # kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h39m nginx NodePort 10.108.178.106 <none> 80:30020/TCP 48m 在浏览器访问:10.108.178.106:30020 # kubectl run myapp --image=ikubernetes/myapp:v1 --replicas=2 # kubectl expose pod myapp --name=myapp --port=80 #实时监视watch # kubectl get pod -w #增加/缩减副本数量: #kubectl scale --replicas=2 deployment myapp #kubectl get pod #升级 #kubectl set image deployment myapp myapp=ikubernetes/v2 #kubectl rollout status deployment myapp #kubectl describe pod myapp-xxxx #回滚 #kubectl rollout undo deployment myapp #kubectl describe pod myapp-xxxx #查看生成的iptabes规则 #iptabes -vnL