项目添加pod管理以及创建本地私有库

项目添加pod管理以及创建本地私有库,第1张

一、项目添加pod管理->步骤如下:

1、打开终端 cd 到项目的, 然后在终端执行: pod init ,项目文件夹中多处一个Podfile文件

2、在终端使用vim打开, 执行: vim Podfile ,编辑内容如下:

3、然后直接执行: pod install 安装pod。安装成功之后是这样的:

项目是这样的:

4、打开项目

使用pod管理的项目, 只能通过后缀为 xcworkspace 的文件打开,就是上图红框框的那个文件。打开之后,项目就是这样子的:

完成上面步骤,即可添加cocoapods项目管理。

二、创建本地私有库的流程:有两种方式创建本地私有库

第一种方式:手动修改podspec文件完成创建

1、创建项目(项目名称:MobileFrame)  

2、 创建私有库文件夹  

3、 创建Classes文件夹(默认指定文件夹 spec文件默认)

4、 在Classes文件夹下创建Person.h Person.m 文件  

5、在Private目录下进行 git 初始化

    1、git init

    2、git add .

    3、git commit-m"创建Person.h Person.m文件"

6、在Private目录下查看

7、在Private目录下 创建spec配置文件

//1.创建spec文件 (PrivateLib 私有库指定的文件)

pod spec create PrivateLib 

//2.创建完私有库后编辑spec文件  以下几个地方修改

s.summary      = "PrivateLib."    //简短的描述

s.description  = "PrivateLib本地私有库测试"  //长描述长度大于s.summary(规范以避免不必要的问题出现)

//许可证改成MIT

s.license      = "MIT" 

//Git后面的URL去掉因为是本地私有库并没有在远程地址上

s.source      = { :git =>"", :tag =>"#{s.version}" } 

//之前创建的Classes文件夹与Spec文件中的对应  会匹配Classes下所有目录文件的.h .m 文件

s.source_files  = "Classes", "Classes/**/*.{h,m}"

如下图: 

8、在MobileFrame目录下 pod 初始化

    pod init //创建podFile 初始化pod

9、 编辑podFile文件  

因为是本地私有库 要指定地址(地址是在当前xxx.codeproj相对的路径如下图) 

10、在MobileFrame目录下 pod install安装本地私有库

    pod install

如果以上 *** 作都正确 pod install 后项目中没有出现Person.h Person.m 那么请重启Xcode

第一种方式:自动完成对podspec文件的创建

1、使用命令创建私有库,并且按照提示回答几个问题:

    pod lib createLTFramework

私有库使用什么语言?

私有库中是否需要包含一个demo工程?

私有库是否需要包含一个测试框架?

私有库的类前缀是什么?

2、私有库工程已经创建好了,并且会自动打开

3、在私有库中加入一个分类文件,重新执行命令

    pod install

4、在MobileFrame的podfile文件中添加”LTFramework”私有库路径,再重新执行命令安装私有库:

    pod install

5、在MobileFrame中成功依赖私有库

6、使用私有库中的方法

7、在pod lib create时可能会出现如下的错误:

JerryMBP:~ Jerry.Yao$ pod lib create LTFramework

Cloning `https://github.com/CocoaPods/pod-template.git` into `LTFramework`. 

Configuring LTFramework template. 

/Users/Jerry.Yao/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:120:in `require': cannot load such file -- colored2 (LoadError) 

    from /Users/Jerry.Yao/.rvm/rubies/ruby-2.3.0/lib/ruby/site_ruby/2.3.0/rubygems/core_ext/kernel_require.rb:120:in `require' 

    from /Users/Jerry.Yao/Desktop/Test/LTFramework/setup/TemplateConfigurator.rb:2:in `<top (required)>' 

    from ./configure:5:in `require_relative' 

    from ./configure:5:in `block in <main>' 

    from ./configure:4:in `each' 

    from ./configure:4:in `<main>' 

To learn more about the template see `https://github.com/CocoaPods/pod-template.git`. 

To learn more about creating a new pod, see `http://guides.cocoapods.org/making/making-a-cocoapod`.

解决办法是输入如下两条命令行:

1> sudo gem install colored2

2> sudo gem update --system

pkg/kubelet/kubelet.go   -->  HandlePodAdditions 方法

Pod创建首先来看看 HandlePodAdditions 函数。

1. 函数首先将pods按照创建日期排列,保证最先创建的 pod 会最先被处理;

2. 然后按照创建日期依次处理Pod:调用 kl.podManager.AddPod(pod),将Pod加入podManager,podManager 是一个重要的结构,前面说过的 manager 都依赖于这个结构体工作。它是 kubelet 的 source of truth,所有被管理的 pod 都要出现在里面。如果 podManager 中找不到某个 pod,就认为这个 pod 被删除了

3. 这里还有一个mirrorpod的概念,mirrorpod主要与kubelet运行于standalone模式有关,假如pod是通过file或http的形式获得的,这个pod被称为static pod,k8s会在集群中创建一个对应的mirror pod;

4. 验证 pod 是否能在该节点运行,如果不可以直接拒绝;

5. 接着函数调用kl.dispatchWork,把 pod 分配给给 worker 做异步处理;

6. 在 probeManager 中添加 pod,如果 pod 中定义了 readiness 和 liveness 健康检查,启动 goroutine 定期进行检测;

dispatchWork 

它的作用就是根据 pod 把把接收到的参数封装成 UpdatePodOptions,发送给特定的执行者 podWorkers (调用 kl.podWorkers.UpdatePod 方法) 。

1. 在PodWorkers里比较重要的是 podUpdates, 是一个map类型,每一个Pod的uuid作为key,而 UpdatePodOptions 的 channel 作为 value 传递 pod 信息;

2. UpdatePod方法首先会去检查 podUpdates 这个map,如果新创建的 Pod 没有update goroutine,它会创建一个 goroutine,执行函数 mannagePodLoop。注意每一个pod都会有一个相应的 goroutine 执行 mannagePodLoop,其参数 podUpdates 这个 channel 则用来传递pod update的信息;除此之外,它还会更新 podUpdate 和 isWorking,填入新 Pod 的信息,并往 podUpdates 管道中发送接收到的 pod 选项信息。

managePodLoop

managePodLoop方法调用syncPodFn函数去同步Pod,syncPodFn这个函数实际上是syncPod函数;(定义在pkg/kubelet/kubelet.go Run方法中)

syncPod

pkg/kubelet/kubelet.go   -->  syncPod 方法

syncPod  是单个Pod同步的事务脚本(syncPod is the transaction script for the sync of a single pod.)。

1. 如果是删除 pod,立即执行并返回;

2. 检查 pod 是否能运行在本节点,主要是权限检查(是否能使用主机网络模式,是否可以以 privileged 权限运行等)。如果没有权限,就删除本地旧的 pod 并返回错误信息;

3. 如果是 static Pod,就创建或者更新对应的 mirrorPod;

4. 创建 pod 的数据目录,存放 volume 和 plugin 信息,即目录/var/lib/kubelet/uuid;

5. 如果定义了 PV,等待所有该Pod依赖的 volume mount 完成(volumeManager 会在后台做这些事情);

6. 如果有 image secrets,去 apiserver 获取对应的 secrets 数据;

7. 调用 container runtime 的 SyncPod 方法,去实现真正的容器创建逻辑;

这里所有的事情都和具体的容器没有关系,可以看做是提前做的准备工作。最重要的事情发生在 kl.containerRuntime.SyncPod() 里,也就是上面过程的最后一个步骤,它调 runtime 执行具体容器的创建

docker 的话 

pkg/kubelet/kuberuntime/kuberuntime_manager.go --> SyncPod方法

rkt 的话

pkg/kubelet/rkt/rkt.go --> SyncPod方法

以docker为例,看一下 SyncPod 方法

1. 计算沙箱和容器的更改,根据最新拿到的 pod 配置与当前运行的容器配置进行对比,计算其中的变化;

2. 如果沙箱容器改变了,那么杀掉这个容器。这个主要是当沙箱变化的时候,需要重建pod,譬如切换了pause镜像,就会触发这个 *** 作;

3. 如果 Pod 不存在了,那么杀死其中的所有容器;

4. 如果有必要,创建一个沙盒。获取 PodSandbox 的配置 (e.g., metadata, clusterDNS, 容器的端口映射等)。kubelet之所以引入沙箱,是想建立一个容器标准,这里可以简单理解成那个pause容器。所有的网络都是挂在这个基础容器里面;

5. 启动初始化容器。init容器是为业务容器做初始化工作的,譬如可以预先从网络上面加载一些动态资源;

6. 启动普通容器。就是通过读取podContainerChanges.ContainersToStart管道里面,需要启动的容器,然后for循环逐一创建这个pod里面的container;

在创建pod时,如果DNS配置不合理,想在pod里的/etc/hosts添加相关条目进行解析,可以使用hostAliases来实现。

hostAliases在.spec下定义,和containers字段对齐。

在/etc/hosts里每行的条目的格式是:

IP地址1 主机名1 主机名2

当访问主机1或者主机2时,系统会自动解析到 IP地址1 这样。

在hostAliases里定义的格式是

- ip: "ip地址1"

hostnames:

- "主机名1"

- "主机名2"

这样在创建pod之后,pod的/etc/hosts会自动多了如下条目。

IP地址1 主机名1 主机名2

看下面的例子,创建一个pod3,yaml文件如下。

[root@vms51 ~]# cat pod3.yaml

apiVersion: v1

kind: Pod

metadata:

name: pod3

spec:

terminationGracePeriodSeconds: 0

hostAliases:

- ip: "10.1.1.1"

hostnames:

- "aa.local"

- "bb.local"

- ip: "10.1.1.2"

hostnames:

- "cc.local"

- "dd.local"

containers:

- name: pod3

image: busybox

imagePullPolicy: IfNotPresent

command: ["sh","-c","cat /etc/hosts sleep 10000000"]

restartPolicy: Never

dnsPolicy: ClusterFirst

[root@vms51 ~]#

这里创建pod3,这里在hostAliases里两个两个IP,每个IP对应两个主机名,所以在pod3里的/etc/hosts添加两个条目

10.1.1.1 aa.local bb.local

10.1.1.2 cc.local dd.local

下面创建pod并验证。

[root@vms51 ~]# kubectl apply -f pod3.yaml

pod/pod3 created

[root@vms51 ~]#

[root@vms51 ~]# kubectl get pods

NAME READY STATUS RESTARTS AGE

pod3 1/1 Running 0 5s

[root@vms51 ~]#

查看pod3里的/etc/hosts的内容。

[root@vms51 ~]# kubectl exec -it pod3 -- tail -3 /etc/hosts

#Entries added by HostAliases.

10.1.1.1 aa.local bb.local

10.1.1.2 cc.local dd.local

[root@vms51 ~]#


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7969952.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存